在可伸缩性,性能方面理解REST

时间:2011-07-13 11:06:02

标签: performance rest scalability

我只是想知道我对REST的看法是否正确。我们假设我们有一个购物网站。使用传统方法,购物车将存储在用户会话中,以便服务器必须为用户管理许多项目(用户#1:item1,item2,item3; User#2:itemA,itemB,item3,...) 。因此,如果有超过一千名用户在网站上浏览并将商品添加到购物车中,则服务器必须具有大量内存/计算能力。

在REST方法中没有会话,因此客户端拥有有关购物车中商品的所有信息。这意味着服务器不需要具有如此大的内存要求,我可以轻松扩展它。

现在,如果我将非REST方法中的项目添加到购物车中,它将直接进入会话。如果我在REST方法中添加一个项目,我必须更新数据库中的实体(/ shoppingcart / 1234 /),这需要更长的时间,因为我必须更深入一级(客户端 - >服务器 - >数据库)。

到目前为止这是正确的还是我错过了或误解了一点?

2 个答案:

答案 0 :(得分:4)

  

在REST方法中没有会话,因此客户端拥有有关购物车中商品的所有信息。

REST无状态约束并不意味着客户需要跟踪购物车中商品的所有信息(请不要这样做)。但它确实意味着购物车的状态是可寻址的(客户端具有服务请求所需的所有信息)。

请考虑以下网址:

/shopping-cart/john.howes

我对无状态约束的理解是,如果我或您或任何人导航到该链接,我们将获得相同资源的一些表示(假设我们有权查看它)。它可以是XML或JSON或HTML,它可以是英语或法语,但底层资源是相同的。如果我将该URL加入书签并稍后在另一台设备上查看或通过电子邮件发送给朋友,我们将获得相同的资源(假设它仍然存在且我们有权查看它)。

所以,因为我有一个指向/shopping-cart/john.howes的链接,所以我获得了为请求提供服务所需的所有信息。

  

现在,如果我将非REST方法中的项目添加到购物车中,它将直接进入会话。如果我在REST方法中添加一个项目,我必须更新数据库中的实体(/ shoppingcart / 1234 /),这需要更长的时间,因为我必须更深入一级(客户端 - >服务器 - >数据库)。

我认为,无论您是否使用REST,将大型对象添加到会话状态都会导致灾难(可维护性,可伸缩性和健全性)。所以,我咬紧牙关并使用数据库。我认为你基本上是正确的:REST没有多说数据如何存储在服务器上,但它确实暗示你不会将用户会话的当前状态存储在Web服务器的内存中。我认为你有很多选择来优化性能。保持所有会议都不是一个很好的选择。

我希望这会有所帮助。

约翰

答案 1 :(得分:1)

在REST中有两种不同的购物车方式。一个是您实际将购物车作为资源并为其分配URI的地方,如您所述。另一个是购物车的内容一直保存在客户端上,直到用户下订单为止。

这两种方法都有利有弊,是的,将购物车存储为资源需要将购物车存储在数据库中(尽管可能是内存数据库!)。

但是,我不认为尝试在这方面进行性能比较,在使用会话和存储购物车作为资源之间,这是特别有价值的。