5

对于快速应用程序,我已经看到有一个 connect-mongodb 和 connect-redis 中间件用于存储会话,但我不明白为什么这是必要的 - 默认的内存会话存储有什么问题?是否适用于需要跨多台机器同步会话的大型应用程序?

此外,任何人都可以为最快的会话存储提供任何基准/提示吗?我的猜测是 Redis,因为它更简单的键/值存储。

4

1 回答 1

12

将会话数据存储在数据库(MongoDB、Redis 等)中的唯一原因是,它可以跨 Node 进程使用,并且可以跨故障保持持久。在横向扩展架构中,非常希望拥有无状态服务器,这样无论特定用户连接到哪个服务器,一切都可以正常工作,并且服务器可以在不丢失任何状态的情况下上下移动。

换句话说,假设您在处理传入请求的负载均衡器后面有 10 台服务器。用户 1 发出服务器 A 处理并登录的请求。您需要存储他们已登录的事实,以便将其存储在会话中。下一个请求最终被路由到服务器 C,因为服务器 A 正忙于另一个请求。为了让服务器 C 知道用户已经登录,它需要会话数据。那么它如何访问服务器 A 存储的会话数据呢?

一种方法是将数据存储在客户端的 cookie 中,该 cookie 随每个请求一起提交,但这不是很安全。另一种方法是尝试在 Node 服务器之间同步状态,这可以做到,但成本高且容易出错。最简单的方法是将会话 ID 存储在 cookie 中,然后将实际会话数据存储在数据库中。然后每个节点服务器都可以访问相同的数据库,以便他们可以查找会话数据。通过这种方式,您可以轻松地扩展和扩展 Node 服务器,并在服务器出现故障时对它们进行负载平衡,而不会丢失任何数据。

在性能方面,内存存储将是最快的(但有上述缺点)。Redis 将是第二快的,而 MongoDB 将是最慢的(通常比 Redis 慢 4 倍左右)。请记住,对于绝大多数网站来说,任何一个都足够快。

于 2012-05-06T02:05:59.240 回答