RESTful API必须是无状态的,但并发性呢?

RESTful API必须是无状态的,但并发性呢?,api,rest,concurrency,stateless,Api,Rest,Concurrency,Stateless,我很好奇如何解决RESTful API的并发性问题。更具体地说,我有一个需要手动检查和更新的对象集合,例如,需要手动更新列的许多行;但是,如果我向多个客户端打开API,它们都会从上到下抓取这些项,因此许多用户将同时填充同一行的列。我更喜欢没有冲突,简单、有状态的方法是将项目转储到服务的队列中,并在人们请求时将其弹出 这个的无状态版本是什么?按IP地址散列,还是根据id随机抓取行 ::更新:: “人力资源管理,所以从客户的角度来看,它必须是无状态的 这当然很有意义。我刚刚读了一篇关于restful

我很好奇如何解决RESTful API的并发性问题。更具体地说,我有一个需要手动检查和更新的对象集合,例如,需要手动更新列的许多行;但是,如果我向多个客户端打开API,它们都会从上到下抓取这些项,因此许多用户将同时填充同一行的列。我更喜欢没有冲突,简单、有状态的方法是将项目转储到服务的队列中,并在人们请求时将其弹出

这个的无状态版本是什么?按IP地址散列,还是根据id随机抓取行

::更新::


“人力资源管理,所以从客户的角度来看,它必须是无状态的

这当然很有意义。我刚刚读了一篇关于restful API的文章(ibm.com/developerworks/webservices/library/ws-restful),在遇到分页的问题后,我担心我的有状态队列类似于按页递增,但实际上它们与“下一页”完全不同在客户端,“pop”是相对的,而对于客户端,“pop”总是无状态的:以前弹出什么并不重要


谢谢你让我清醒过来!“-Me

您可以采取两种基本方法:

  • 完全无状态,并采用“最后一个请求”“战略。听起来很奇怪,从可预测性、可伸缩性、代码复杂性以及客户端和服务器端的实现方面来看,它可能是最干净的解决方案。它还有很多优先权:看看像谷歌这样的网站是如何在第2页使用
    start=10
    、第3页使用
    start=20
    等查询中分页的

    您可能会发现,当您在页面之间来回导航时,页面内的内容会发生变化,但那又怎样呢?你总是能得到最新的信息,谷歌可以在他们的任何一台服务器上处理你的请求,而无需找到你的会话信息来确定你上次的查询上下文是什么

    这种方法的最大优点是服务器实现的简单性。每个请求都可以直接传递到后端的数据层,在HTTP级别(通过E-Tags或Last Modified Header)和服务器端(例如,使用memcache)进行缓存是完全成熟的

  • 进入有状态状态,找出一种方法,让您的服务器为每个API“会话”分配某种类型的每客户端锁或令牌。这就像试图用一根棍子对抗大海的潮汐,因为你最终会失败和沮丧

    您将如何识别客户?会话密钥?IP地址?他们使用的套接字的文件描述符(如果您使用HTTP这样的传输,那么祝您好运,在这种传输中,请求之间的连接可以关闭…)?您为此选择的详细信息必须保留在服务器端,或者您必须在应用程序服务器上使用一些令人讨厌的旧粘性会话功能(如果是这样的话,如果您的客户端正在使用的服务器在会话中宕机,上帝会帮助您的客户端)

    您将如何处理不正常消失的API客户机?你会让收割者线程清理空闲的会话锁,从而自动超时会话锁吗?这意味着更多的代码,更复杂,更多的bug隐藏的地方。如果API客户端从长时间的空闲状态返回并尝试重新使用过期的锁,那么应该如何构建客户端应用程序来处理这种情况呢


  • 我可以继续,但希望你能理解我的观点。选择选项1,然后变为无状态。否则,您将试图在服务器端跟踪客户端状态唯一应该跟踪客户机状态的是客户机本身。

    维护资源状态是可以的。“无状态禁止”只是指会话状态

    以下是一段摘录:

    接下来,我们将向客户机-服务器交互添加一个约束: 通信在本质上必须是无状态的,如 第3.4.3节(图5-3)中的客户端无状态服务器(CSS)样式, 这样,从客户端到服务器的每个请求都必须包含 了解请求所需的信息,并且不能 服务器上任何存储上下文的优势。会话状态为 因此完全由客户负责


    遇到这个问题,寻找处理并发性的最佳实践,
    从答案中,没有任何关于“”的参考。

    我看不出这里有什么问题。RESTful API可以——而且IME几乎总是——由有状态服务器支持。你能澄清一下你试图解决的问题吗?电子标签可以用来提供并发性,所以从客户端的角度来看,它必须是无状态的?这当然很有道理。我刚刚读了一篇关于RESTful API的文章(),在遇到分页的问题后,我担心我的有状态队列类似于按页递增,但实际上它们是完全不同的,因为“下一页”在客户端是相对的,而“pop”在客户端总是无状态的。以前爆出什么并不重要。谢谢你让我清醒过来!我不认为在浏览结果集页面时接受内容更改是唯一的思考方式。您可能会看到两个条目——好的(客户机可以处理),但您也可能会完全由于删除了过去/以前页面的范围而错过条目——这不好。对于谷歌搜索结果,这可能无关紧要,但在其他情况下可能无关紧要。作为替代方案,可以在客户端获取“所有ID”(好的,对于大多数情况下都不可行的谷歌搜索结果),并逐页浏览此列表,在到达带有该ID子集的结果集页面时加载更多内容。坏消息是,问题马上又来了:可能有问题