Sticky Sessions:好还是坏?

时间:2011-11-21 15:54:21

标签: session amazon-ec2 amazon race-condition

我有一个Web应用程序,当向我的两个负载平衡服务器发送相同的请求时,似乎有间歇性的竞争条件。显然,此时两者都没有完成事务,因此每个服务器上的两个操作都是有效的。

粘性会话会解决此问题吗?粘性会话的使用是否令人不悦?还有什么可能是其他解决方案?

我现在正在亚马逊使用他们的负载均衡器托管。

1 个答案:

答案 0 :(得分:4)

如果将单个请求发送到负载平衡服务器集,则只有其中一个服务器应该获得请求,通常通过循环分配。如果您发出单个请求,并且它会对您的服务器造成其他错误。

否则我会假设您发出2个快速请求并且他们点击了两个负载平衡服务器(如循环法),在第二个请求到达服务器之前您的事务未完成,并且您认为粘性会话将解决这个问题。

粘性会话会将此会话中的所有请求发送到同一服务器。在您的示例中,两个请求现在都会访问同一个服务器,如果您没有执行任何其他操作,第一个请求的事务将不会在第二个请求启动之前提交,因此您将得到相同的结果,即单独的粘性会话无济于事。

如果交易类似于下订单,那么您可以制作代码,以便在成功提交后删除购物车的内容。 第一个完成请求将删除购物车,第二个请求将失败,您可以通知用户订单已经放置。

粘性会话可以使高可用性和可伸缩性变得更加复杂。对于前者,考虑一个服务器发生故障的情况 - 该服务器上的所有会话也将关闭,您必须编写代码才能将其转发到其他服务器。

对于后一种情况,假设您的会话持续一段时间,例如1/2小时,如果你有N个新用户来到网站,他们最初将在两个服务器之间平均分配。如果在1/2小时之前,来自服务器1的所有用户都离开而另一个M用户进入,则服务器2上将有更多负载,其具有原始N / 2用户加上新M / 2用户,而服务器1仅具有M / 2个用户,即您将浪费容量,需要编码才能修复。

有时粘性会话可能有用,但除非你有充分的理由使用它们我会避免它们