当一个相同的请求发送到两个负载平衡服务器时,我有一个Web应用程序似乎处于间歇性竞争状态。显然,此时都没有完成事务,因此每个服务器上的两个操作均有效。
即时贴会解决此问题吗?粘性会话的使用是否会被拒绝?还有什么其他解决方案?
我现在正在使用他们的负载平衡器托管在Amazon中。
最佳答案
如果将单个请求发送到负载平衡的服务器集,则只有一个服务器应获得该请求,通常通过循环分配。如果发出单个请求,但同时又击中了两个服务器,则可能是其他问题。
否则,我将假定您正在发出2个快速请求,并且它们同时击中了两个负载平衡服务器(就像轮询),您的事务未在第二个请求到达服务器之前完成,并且您认为粘性会话可以解决此问题。
粘性会话会将该会话中的所有请求发送到同一服务器。在您的示例中,两个请求现在都将命中同一台服务器,并且如果您什么都不做,那么在第二个请求开始之前就不会提交第一个请求的事务,因此您将获得相同的结果,即仅粘性会话将无济于事。
如果交易就像下订单,那么您可以编写代码,以便在成功提交后删除购物车中的内容。
完成的第一个请求将删除购物车,第二个请求将失败,您可以向用户通知已下订单。
粘性会话会使拥有高可用性和可伸缩性变得更加复杂。对于前者,请考虑一台服务器宕机的情况-该服务器上的所有会话也将宕机,并且您必须编写代码以将其故障转移到另一台服务器。
对于后一种情况,假设您的会话持续一段时间,例如1/2小时,如果您有N个新用户来到站点,则最初他们将在两台服务器之间平均分配。如果在1/2小时之前服务器1的所有用户都离开并且另外M个用户进入,那么服务器2上的负载将更大,该服务器2上具有原始N / 2个用户和新的M / 2个用户,而服务器1上只有M / 2个用户,即您将浪费容量,并且需要进行代码修复。
有时候粘性会话可能有用,但是除非您有充分的理由使用它们,否则我会避免使用它们