8

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

  1. 每次点击应用程序时,您通常会连接不同的网络测功机吗?
  2. 会话可以跨不同的网络测功机工作吗?
  3. 它是否适用于不同的 Rails 会话存储(ActionDispatch::Session::CookieStore、ActiveRecord::SessionStore 和 ActionDispatch::Session::CacheStore)
4

2 回答 2

15

简而言之,的 - 会话将跨多个网络测功机工作。

会话跨 web dynos 工作——因为 Rail 的会话支持设计允许它这样做。如果有的话,web dyno 模型正是 Rail 的水平缩放方式。

1. 每次你点击应用程序时,你通常会连接不同的网络测功机吗?

基于heroku文档:

路由网格负责确定应用程序的 Web dyno 在 dyno 流形中的位置,并将 HTTP 请求转发到这些 dyno 之一。Dyno 选择是使用随机选择算法执行的。

所以测功机的选择是随机的……但是测功机必须安装您的应用程序。因此,如果您有多个测功机,那么您最终可能会连接到不同的测功机(这很重要,因为这有助于负载平衡和高可用性)

2. 会话可以跨不同的网络测功机工作吗?

是的。大多数 Web 堆栈通过执行以下操作来支持会话:

  1. 分配一个会话 id - 这是一个唯一的 id,它通常设置为一个会话 cookie,以便浏览器始终将带有任何 HTTP 请求的 id 发送到原始主机
  2. 提供将会话 ID 映射到实际会话数据的存储

因此,通过此过程,可以支持会话,因为每个入站 HTTP 请求都有会话 ID,Web dyno 在处理您的请求时可以访问该会话 ID。

3. 它是否适用于不同的 Rails 会话存储(ActionDispatch::Session::CookieStore、ActiveRecord::SessionStore 和 ActionDispatch::Session::CacheStore)

ActionDispatch::Session::CookieStore 是的。cookie 存储将加密的会话数据存储为 cookie。因此,您的浏览器会将所有会话数据(加密)发送回主机,然后将其解密以在您的应用程序中使用。

ActiveRecord::SessionStore 是的。cookie 存储将加密的会话数据存储在数据库表中。然后将 ID 分配为 cookie。因此,您的浏览器将 ID 发送到主机,然后用于从数据库加载会话数据。由于所有网络测功机都与数据库连接,这意味着它也受支持。

ActionDispatch::Session::CacheStore 是的,但您需要缓存存储服务(例如 MemCache 插件)。cookie 存储将加密的会话数据存储在缓存存储 (memcache) 中,这是跨所有 Web dyno 的共享服务。然后将 ID 分配为 cookie。因此,您的浏览器将 ID 发送到主机,然后用于从缓存存储 (memcache) 加载会话数据。

于 2012-08-17T01:11:08.733 回答
5

我不相信 Heroku 会努力将连续的请求发送到同一个 web dyno。我可能是错的,他们会做出一些努力,但即使他们这样做了,它也不太可能足够可靠来依赖会话管理。

但是,ActionDispatch::Session::CookieStore 肯定会起作用,因为数据存储在加密的客户端 cookie 中。ActiveRecord::SessionStore 将起作用,因为数据存储在数据库中,可能由所有 Web dynos 共享。如果您使用在所有客户端之间共享的 MemCached 服务器或类似的共享缓存,ActiveDispatch::Session::CacheStore 应该可以工作。

唯一不起作用的是本地文件系统上的某种基于文件的会话存储,而像多个 Heroku dynos 这样的情况正是这种类型的会话存储在现代 Web 应用程序中不常见的原因。

于 2012-08-17T00:42:51.453 回答