如果REST应用程序应该是无状态的,那么您如何管理会话?
我需要一些澄清。 我一直在阅读REST,并构建RESTful应用程序。 根据维基百科,REST本身被定义为具象状态传输。 因此,我不明白所有这些每个人都在不停地喷涌的无国籍的gobbledeygook。
从维基百科:
在任何特定时间,客户可以在应用程序状态之间转换或“静止”。 处于休眠状态的客户端能够与其用户进行交互,但不会创建任何负载,也不会在该组服务器或网络上占用每个客户端的存储空间。
他们只是说不使用会话/应用程序级别的数据存储?
例如,我知道REST的一个目标是使URI访问一致并可用,而不是在帖子内部隐藏分页请求,使得请求的页码成为GET URI的一部分。 我感觉合理。 但它似乎只是过度的说,每个客户端数据(会话数据)都不应该存储在服务器端。
如果我有一个消息队列,并且我的用户想要阅读这些消息,但是在他阅读这些消息时,想要阻止某些发送者消息在会话期间通过? 将它存储在服务器端的地方并让服务器只发送未被用户阻止的消息(或消息ID)是否有意义?
每次我请求新的消息列表时,是否真的必须发送整个消息发送者列表来阻塞? 与我相关的消息列表首先不会/甚至不应该成为公众可用的资源。
再次,只是试图理解这一点。 有人请澄清。
更新:
我发现了一个堆栈溢出的问题,它的答案并不完全让我一直在那里:如何管理REST中的状态,它说明重要的客户端状态应该全部在每个请求上传输.... Ugg ..似乎有很多开销......这是对的吗?
基本的解释是:
服务器上没有客户端会话状态。
无状态意味着服务器不会在服务器 端存储有关客户端会话的任何状态。
客户端会话存储在客户端上。 服务器是无状态的,意味着每个服务器可以随时为任何客户端提供服务,不存在会话关联或粘滞会话。 相关的会话信息存储在客户端并根据需要传递给服务器。
这并不排除Web服务器与维护有关诸如购物车等业务对象状态的其他服务,而不是关于客户端当前的应用程序/会话状态。
客户端的应用程序状态不应该存储在服务器上,而应该从客户端传递到每个需要它的地方。
这就是REST中的ST来自State Transfer。 你转移状态而不是让服务器存储它。 这是扩展到数百万并发用户的唯一方法。 如果没有其他原因,而不是因为数百万次会话是数百万次会话。
会话管理的负载在所有客户端之间进行摊销,客户端存储其会话状态,服务器可以以无状态的方式服务许多数量级或更多的客户端。
即使对于您认为仅需要数十个并发用户的服务,您仍然应该使您的服务成为无状态。 成千上万的人仍然有数万人,并且会有与其相关的时间和空间成本。
无状态是HTTP协议和一般的网络是如何设计运行的,并且是一个整体上更简单的实现,并且你有一个代码路径而不是一堆服务器端逻辑来维持一堆会话状态。
有一些非常基本的实施原则:
这些原则并非实现,您如何满足这些原则可能会有所不同。
总之,五个关键原则是:
在REST论文中没有关于认证或授权的内容。
因为与从非RESTful请求进行身份验证相比,没有任何区别。 认证与RESTful讨论无关。
解释如何为您的特定需求创建无状态应用程序,对于StackOverflow来说过于广泛。
与REST相关的实现身份验证和授权甚至更广泛,并且通常在互联网上详细解释各种实现方法。
有关此问题的意见征求/意见将被标记为不再需要 。
无状态意味着每个HTTP请求都完全隔离。 客户端发出HTTP请求时,会包含服务器完成该请求所需的所有信息。 服务器从不依赖以前请求中的信息。 如果这些信息很重要,那么客户会在这个请求中再次发送它。 无状态还带来了新的功能。 在负载平衡的服务器上分发无状态应用程序更容易。 无状态应用程序也很容易缓存。
实际上有两种状态。 应用状态,位于服务器上的客户端和资源状态。
当您实际提出请求时,Web服务只需要关心您的应用程序状态。 其余时间,它甚至不知道你的存在。 这意味着只要客户端发出请求,它就必须包含服务器需要处理的所有应用程序状态。
资源状态对于每个客户端都是相同的,并且其适当的位置在服务器上。 当您将图片上传到服务器时,您会创建一个新资源:新图片具有自己的URI,并且可以成为未来请求的目标。 您可以通过HTTP获取,修改和删除此资源。
希望这有助于区分无国籍状态和各个州的含义。
他们只是说不使用会话/应用程序级别的数据存储?
不,他们并不是以微不足道的方式说这些话的。
他们说不定义“会话”。 不要登录。 不要注销。 为请求提供凭据。 每个请求都是独立的。
你还有数据存储。 您仍然拥有身份验证和授权。 您不必浪费时间建立会话并保持会话状态。
问题在于每个请求(a)完全独立,(b)可以在没有任何实际工作的情况下轻松实现到一个巨大的并行服务器场。 Apache或Squid可以盲目且成功地传递RESTful请求。
如果我有一个消息队列,并且我的用户想要阅读这些消息,但是在他阅读这些消息时,想要阻止某些发送者消息在会话期间通过?
如果用户需要过滤器,那么只需在每个请求上提供过滤器即可。
对于服务器只发送未被用户阻止的消息(或消息ID)是否合理?
是。 在RESTful URI请求中提供过滤器。
每次我请求新的消息列表时,是否真的必须发送整个消息发送者列表来阻塞?
是。 这个“消息发送者阻止列表”有多大? PK的短名单?
GET请求可能非常大。 如果有必要,即使听起来像是一种查询,你也可以尝试POST请求。
链接地址: http://www.djcxy.com/p/1079.html上一篇: If REST applications are supposed to be stateless, how do you manage sessions?