REST如何实现无状态?

4
我知道REST,并且知道如何创建无状态的RESTful Web服务,我知道这是更好的方式。但是我并不真正理解无状态的概念以及如何使用REST可以使应用程序具有可扩展性。
有人能够解释一下REST的这两个方面:无状态和可扩展性,以及SOAP的不同之处和不推荐使用的原因吗?
3个回答

6

有状态的API会为所有连接的客户端维护会话。这意味着会话需要在服务器之间共享,从而限制了可伸缩性。

通过将此状态存储在客户端并将其与每个请求一起发送,您可以拥有相同的状态,但具有更好的可伸缩性。


所以,如果我理解正确的话,为了实现可扩展性,必须有多个服务器,如果只有一个服务器,那么就只有一个会话存储/用户,是吗? - Noor
即使如此,会话仍需要在一个服务器内共享,这总是会有一些性能影响。将API设计为无状态是一个好习惯。这也使得那些想要与API进行接口的人更容易操作。 - Tom van der Woerdt

2
创建RESTful服务并不能使您的应用程序具有可扩展性。事实上,您可以创建基于会话的RESTful服务,并且无法跨越多个机器,或者是粘性会话或完全无状态。
至于可扩展性,许多因素决定一个服务是否可扩展,实际上,即使需要会话,服务也可以是可扩展的(例如,如果您的服务具有粘性会话,这意味着会话托管在一台机器上,并且网站访问者总是返回到同一台机器,其中他的会话存在)。
无状态服务使得扩展更容易,因为这意味着一旦请求已经被处理,下一个来自该网站访问者的请求不一定要回到同一台机器,这意味着你可以(理论上)有尽可能多的机器来服务相同类型的请求。如果您的流量增加一倍,您只需添加相同数量的机器,就可以服务两倍的请求。
然而,在实践中,事情变得复杂了,很少能够创建完全无状态的服务。大多数情况下,如果您的网站访问者可以更新数据,您会遇到并发问题,因为两个网站访问者可以更改相同的数据,必须进行某种同步以防止数据损坏。在这些情况下,您可能需要拆分服务,使得允许更改数据的服务不是无状态的,而允许提取数据的服务是无状态的。在大多数情况下,我猜重的工作大部分在数据提取方面而不是数据更新方面,所以这很好运作。
至于SOAP,我只能说世界正在朝着REST的方向发展,因为它更加轻量级。

1

无状态意味着您可以拥有任意数量的前端,每个前端都可以以相同的方式响应请求,无需处理文件系统会话。

因此,您可以进行扩展(添加任意数量的前端),这是选择无状态的最明显原因。


成为无状态的最明显原因是什么?我认为你可能会添加一些词,改变一些词或删除一些词... - madflow
我曾经与 Web 服务一起工作,在这种情况下,每个请求都将包含一个 XML 文件,其中包含用户名和密码,并且您需要每次都输入。因此,在这种情况下,它也是可扩展的。 - Noor
@madflow 重写了这部分。 - Damien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接