在不同类型的Web服务器之间共享会话

时间:2015-08-09 14:52:06

标签: ruby-on-rails django session autoscaling

我公司的一些网络服务是使用不同的网络应用程序构建的。(Rails,Django,PHP)

分享会话状态的最佳做法是什么

这样用户就不必在不同服务器之间反复登录。

我在AWS自动缩放组中构建了我的Rails应用程序。

即使我浏览同一个网站,但下次我可能在另一台服务器上浏览,所以我必须再次登录。因为服务器没有我的会话状态。

我需要一些更好的主意或关键字来搜索这类问题。

提前致谢

enter image description here

2 个答案:

答案 0 :(得分:1)

我可以想到两种方法可以实现这个目标

  1. 实现利用数据库会话管理的自定义会话处理机制,即所有会话将存储在数据库中的特殊表中,并且可供所有服务器访问。
  2. 拥有一个中央身份验证服务(CAS),它将充当所有其他服务器的代理。这意味着必须在请求到达负载均衡器之前执行此步骤。
  3. 如果您环顾四周,许多人可能会推荐选项1,但可能也是一种过度杀伤,因为您需要在每个服务器中进行自定义会话管理。但是,您的选择可能取决于您希望实现的具体目标,系统架构的整体灵活性以及您掌握的时间。 CAS可能是解决问题的一种更直接的方式。

答案 1 :(得分:0)

在您的应用程序数据库中存储用户会话不是AWS的推荐选项。

使用数据库的最大问题是,您需要编写一些每隔一段时间运行一次的清理脚本,以清除所有过期用户会话的表。这很麻烦,会产生更多开销,并给您的数据库带来更多压力。

但是,如果您确实想要使用实际数据库,则应使用像Dynamo这样的NoSQL数据库。这将为您提供比关系数据库更好的性能。在数据传输方面,它也可能更具成本效益。但是,最大的问题是你仍然需要那个烦人的清理脚本。注意SDK中内置了支持,可以使用PHP和Dynamo来存储用户的会话:
http://docs.aws.amazon.com/aws-sdk-php/v2/guide/feature-dynamodb-session-handler.html

最好但成本最高的解决方案是使用ElastiCache群集。您可以设置您选择的TTL,这意味着您不必担心清理脚本。此外,ElastiCache将比Dynamo或任何关系数据库获得更好的性能,因为数据存储在ElastiCache节点的RAM中。 ElastiCache的主要缺点是目前它无法动态扩展。因此,如果有太多用户同时登录,如果您没有配置足够大的群集,事情就会变得很难看。
http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/WhatIs.html

但是你可以打赌,在AWS上托管的所有最大,最糟糕和最好的应用程序要么使用Dynamo,ElastiCache,要么使用自定义NoSQL或Cache集群解决方案来存储用户会话。

请注意,所有AWS开发工具包都支持这两种服务:
https://aws.amazon.com/tools/