Heroku上的多个Web Dynos是否支持会话?

8

如果您在Heroku上运行一个带有多个Web dyno的Rails 3应用程序,

  1. 每次访问应用程序时,您通常会连接到不同的Web dyno吗?
  2. 会话是否可以在不同的Web dyno之间工作?
  3. 对于不同的Rails会话存储(ActionDispatch :: Session :: CookieStore, ActiveRecord :: SessionStore和ActionDispatch :: Session :: CacheStore),它是否有效?
2个回答

15
Yes. The ActiveRecord session store stores session data in a relational database using Active Record. This allows you to scale your application across multiple web dynos, as all of them can access the same database.

ActionDispatch::Session::CacheStore Yes. The cache store stores session data in a cache, such as Memcached or Redis. This allows you to scale your application horizontally, as multiple web dynos can share the same cache instance.

是的。Cookie存储将加密的会话数据存储在数据库表中。然后会分配一个ID作为cookie。因此,您的浏览器会将ID发送到主机,然后使用它从数据库中加载会话数据。由于所有Web dynos都连接到数据库,因此这也是被支持的。
ActionDispatch :: Session :: CacheStore 是的,但您需要缓存存储服务(例如MemCache附加组件)。 Cookie存储将加密的会话数据存储在缓存存储(memcache)中,这是所有Web dynos共享的服务。然后会分配一个ID作为cookie。因此,您的浏览器会将ID发送到主机,然后使用它从缓存存储(memcache)中加载会话数据。

请注意,还有会话亲和力可以启用,可能会有用处:https://devcenter.heroku.com/articles/session-affinity - Adam Reis

5
我不认为Heroku会尽力将连续的请求发送到同一个Web Dyno。我可能错了,他们可能会尽一些努力,但即使他们这样做了,也不太可能足够可靠以便于用来进行会话管理。
然而,ActionDispatch::Session::CookieStore肯定会起作用,因为数据存储在加密的客户端cookie中。ActiveRecord::SessionStore可以工作,因为数据存储在数据库中,这个数据库显然是所有web dynos共享的。如果你使用一个在所有客户端之间共享的MemCached服务器或类似的共享缓存,则ActiveDispatch::Session::CacheStore应该能够工作。
唯一不能工作的就是某种基于本地文件系统的会话存储方式,而像多个Heroku Dynos这样的情况正是为什么这种类型的会话存储不常见于现代Web应用程序的原因所在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接