session - 粘性 session : Good or Bad?

标签 session amazon-ec2 amazon race-condition

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

粘性 session 能解决这个问题吗?使用粘性 session 是否令人不悦?还有其他一些解决方案吗?

我现在正在使用他们的负载均衡器在 Amazon 中托管。

最佳答案

如果将单个请求发送到负载平衡的一组服务器,则只有一个服务器应该收到请求,通常通过循环分配。如果您发出单个请求并且它同时到达您的两个服务器,则有其他问题。

否则我会假设您正在发出 2 个快速请求并且它们同时命中您的两个负载平衡服务器(就像循环法一样),您的事务在第二个请求命中服务器之前没有完成并且您认为粘性 session 会解决这个问题。

粘性 session 会将此 session 中的所有请求发送到同一台服务器。在您的示例中,这两个请求现在将到达同一台服务器,如果您什么都不做,则在第二个请求开始之前不会提交第一个请求的事务,因此您会得到相同的结果,即单独的粘性 session 无济于事。

如果交易类似于下订单,那么您可以编写代码,以便在成功提交后删除购物车的内容。 完成的第一个请求将删除购物车,第二个请求将失败,您可以向用户发送消息表示已下订单。

粘性 session 会使高可用性和可伸缩性变得更加复杂。对于前者,请考虑一台服务器出现故障的情况——该服务器上的所有 session 也将出现故障,您将不得不编写代码将它们故障转移到另一台服务器。

对于后一种情况,假设您的 session 持续一段时间,例如1/2 小时,如果您有 N 个新用户访问该站点,他们最初将在您的两个服务器之间平均分配。如果在 1/2 小时之前,服务器 1 的所有用户都离开了,而另外 M 个用户进来,那么服务器 2 上的负载将增加,该服务器具有原始 N/2 个用户加上新的 M/2 个用户,而服务器 1 只有 M/2 个用户,即您将浪费容量,需要编写代码来修复。

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

关于session - 粘性 session : Good or Bad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8214536/

相关文章:

c# - asp.net 中的 session 体系结构

Chrome 上未设置 Django-Rest-Framework sessionid 和 csrftoken

laravel - 如何在中间件中使用 session 来始终检查用户是否登录

php - 复选框 "checked"值与 session 和数据库值冲突 PHP

reactjs - 在 AWS 上使用 NextJS SSR 部署 React 应用程序的最便宜方法?

amazon-s3 - S3 存储桶位于同一可用区

python - 在 AWS EC2 实例上使用 nginx 配置 django

amazon-web-services - 来自复杂结构的 Ansible 查找值?

android - 如何为 Amazon IAP 设置 ProGuard?

python - 适用于 Python 的 Amazon SQS 的替代方案