小编典典

如果 REST 应用程序应该是无状态的,那么您如何管理会话?

all

我需要澄清一下。我一直在阅读有关 REST 和构建 RESTful 应用程序的内容。根据维基百科,REST 本身被定义为 Representational
State Transfer
。因此,我不理解每个人都在吐槽的所有这些无状态 的 gobbledeygook

来自维基百科:

在任何特定时间,客户端都可以在应用程序状态之间转换或“处于静止状态”。处于休息状态的客户端能够与其用户交互,但不会产生负载,并且不会消耗服务器集或网络上的每个客户端的存储空间。

他们只是说不要使用会话/应用程序级数据存储吗???

我知道 REST 的一个目标是使 URI 访问一致且可用,例如,不是将分页请求隐藏在帖子中,而是使请求的页码成为 GET URI
的一部分。我感觉合理。但似乎只是说不应该将 每个客户端数据 (会话数据)存储在服务器端。

如果我有一个消息队列,并且我的用户想要阅读这些消息,但是当他阅读它们时,想在他的会话期间阻止某些发件人消息通过,该怎么办?将其存储在服务器端的某个位置并让服务器仅发送未被用户阻止的消息(或消息
ID)是否有意义?

每次我请求新的邮件列表时,我真的必须发送整个邮件发件人列表来阻止吗?与我相关的消息列表首先不会/不应该是公开可用的资源。

再次,只是试图理解这一点。有人 澄清。


更新:

我发现了一个堆栈溢出问题,它的答案并没有完全让我明白: 如何在 REST中管理状态, 它说重要的客户端状态 应该 在每个请求上都被传输.... Ugg .. 似乎有很多开销… 这是对的吗?


阅读 102

收藏
2022-03-06

共1个答案

小编典典

基本解释是:

服务器上没有客户端会话状态。

无状态意味着 服务器 不会在服务器端存储有关 客户端会话 的任何状态。

客户端会话 存储在客户端上。服务器是无状态的,这意味着每个服务器都可以随时为任何客户端提供服务,没有 会话亲和性粘性会话
。相关的会话信息存储在客户端,并根据需要传递给服务器。

这并不排除 Web 服务器与之交谈的其他服务维护有关诸如购物车之类的业务对象的状态,只是不排除有关客户端当前应用程序/会话状态的状态。

客户端的 应用程序状态永远不应该存储在服务器上,而是从 客户端 传递到每个需要它的地方。

这就是 REST中的 ST 的来源,即 State Transfer 。您转移状态而不是让服务器存储它。
这是扩展到数百万并发用户的唯一方法。* 如果没有其他原因,因为数百万次会话就是数百万次会话。 *

会话管理的负载分摊到所有客户端,客户端存储它们的会话状态,服务器可以以无状态方式为多个数量级或更多的客户端提供服务。

即使对于您认为 需要成千上万个并发用户的服务,您仍然应该使您的服务无状态。几万还是几万,会有时间和空间成本。

无状态是 HTTP 协议和一般 Web 的设计方式,并且是一个整体更简单的实现,您有一个单一的代码路径而不是一堆服务器端逻辑来维护一堆会话状态。

有一些非常基本的实现原则:

这些是原则而不是实现,您如何满足这些原则可能会有所不同。

总而言之,五个关键原则是:

  1. 给每一个“兴”一个ID
  2. 将事物联系在一起
  3. 使用标准方法
  4. 具有多种表示的资源
  5. 无状态通信

REST论文中没有关于身份验证或授权的内容。

因为认证一个 RESTful 的请求和一个非 RESTful 的请求没有什么不同。身份验证与 RESTful 讨论无关。

解释如何为您的特定需求创建无状态应用程序对于 StackOverflow来说 过于宽泛。

实现与 REST 相关的身份验证和授权更加 广泛 ,并且在互联网上一般都非常详细地解释了各种实现方法。

寻求帮助/信息的评论将/应该被标记为 不再需要

2022-03-06