Web services 为什么RESTful应用程序更容易扩展

Web services 为什么RESTful应用程序更容易扩展,web-services,rest,architecture,Web Services,Rest,Architecture,我经常读到,选择RESTful架构的一个原因是(除其他原因外)高负载的Web应用程序具有更好的可伸缩性 为什么呢?我能想到的一个原因是,由于定义的资源对于每个客户端都是相同的,所以缓存变得更容易。在第一个请求之后,后续的请求由memcached实例提供,该实例在水平方向上也具有良好的伸缩性 但是你不能用一种传统的方法来实现这一点,即在url中编码动作,例如(booking.php/userid=123&travelid=456&foobar=789) REST的一部分实际上是URL部分(它是RE

我经常读到,选择RESTful架构的一个原因是(除其他原因外)高负载的Web应用程序具有更好的可伸缩性

为什么呢?我能想到的一个原因是,由于定义的资源对于每个客户端都是相同的,所以缓存变得更容易。在第一个请求之后,后续的请求由memcached实例提供,该实例在水平方向上也具有良好的伸缩性


但是你不能用一种传统的方法来实现这一点,即在url中编码动作,例如(booking.php/userid=123&travelid=456&foobar=789)

REST的一部分实际上是URL部分(它是REST中的R),但是s对于伸缩性更为重要:state

REST的服务器端是无状态的,这意味着服务器不必跨请求存储任何内容。这意味着服务器之间不必进行(很多)通信,从而使其具有水平可扩展性


当然,R(代表性)有一个小小的好处,那就是如果你有很好的URL,负载平衡器可以轻松地将请求路由到正确的服务器,GET可以转到从属服务器,而POST可以转到主服务器。

我认为Tom所说的是非常准确的,但是可伸缩性的另一个问题是在扩展时改变的障碍。因此,REST的最大租户之一就是超媒体。基本上,服务器将拥有这些路径,并在运行时将它们传递给客户端。这允许您在不破坏现有客户端的情况下更改代码。但是,您会发现REST的大多数实现只是隐藏在REST的伪装后面的RPC…这是不可伸缩的。

原因(可能不是原因)是REST服务是无会话的。这意味着您可以轻松地使用负载平衡器将请求定向到各种web服务器,而无需在所有web服务器之间复制会话状态,也无需确保来自单个会话的所有请求都转到同一web服务器。

在web、云和REST方面,“可伸缩”或是最常被滥用的术语之一,并且主要用于说服管理层获得他们的支持,让他们的开发团队登上休息列车

这是一个毫无价值的时髦词。如果你在网上搜索“REST可伸缩性”,你会发现很多人在没有任何具体证据的情况下相互模仿

REST服务的可伸缩性与通过SOAP接口公开的服务完全相同。两者都只是应用程序服务的HTTP接口。此服务的实际扩展程度完全取决于此服务的实际实现方式。在REST和SOAP中编写一个不能像所有服务那样扩展的服务是可能的

是的,您可以使用SOAP做一些使其扩展性更差的事情,比如依赖状态和会话。开箱即用的肥皂不能做到这一点。这要求您使用更智能的负载平衡器,如果您真的关心任何形式的扩展,那么您无论如何都希望使用它


REST允许的一件事是SOAP不允许的,这里还有其他一些答案,即通过HTTP缓存代理或在客户端缓存可缓存的响应。当许多操作的响应都是可缓存的时,这可能会使REST服务的负载比SOAP服务轻一些。所有这一切都意味着更少的请求最终会出现在您的服务中。

说rest应用程序是可伸缩的主要原因是,它是基于HTTP协议构建的。因为HTTP是无状态的。无状态意味着它不会在其他请求之间共享任何内容。因此,任何请求都可以发送到负载平衡集群中的任何服务器。没有任何内容强制此用户请求转到此服务器。我们可以通过使用令牌来克服这个问题

由于这种无状态性,所有REST应用程序都很容易扩展。但是,如果您希望在每个服务器中获得高吞吐量(每秒可处理的请求数),那么您应该优化应用程序中的阻塞。遵循以下提示

  • 使每个REST资源都是一个小实体。不要从多个表的联接中读取数据
  • 从附近的数据库读取数据
  • 使用缓存(Redis)而不是数据库(您可以保存磁盘I/O)
  • 始终保持数据源尽可能靠近,因为这些块将使服务器资源(CPU)非常理想,并且在理想情况下,没有其他请求可以使用该资源