【发布时间】:2012-05-15 02:20:44
【问题描述】:
对于快速应用程序,我已经看到有一个 connect-mongodb 和 connect-redis 中间件用于存储会话,但我不明白为什么这是必要的 - 默认的内存中会话存储有什么问题?是否适用于需要跨多台机器同步会话的大型应用程序?
另外,任何人都可以为最快的会话存储提供任何基准/提示吗?我的猜测是 Redis,因为它更简单的键/值存储。
【问题讨论】:
标签: session node.js redis express
对于快速应用程序,我已经看到有一个 connect-mongodb 和 connect-redis 中间件用于存储会话,但我不明白为什么这是必要的 - 默认的内存中会话存储有什么问题?是否适用于需要跨多台机器同步会话的大型应用程序?
另外,任何人都可以为最快的会话存储提供任何基准/提示吗?我的猜测是 Redis,因为它更简单的键/值存储。
【问题讨论】:
标签: session node.js redis express
将会话数据存储在数据库(MongoDB、Redis 等)中的唯一原因是它可以跨 Node 进程使用,并且可以在故障中保持持久性。在横向扩展架构中,非常希望拥有无状态服务器,这样无论特定用户连接到哪台服务器,一切都可以正常工作,并且服务器可以在不丢失任何状态的情况下上下移动。
换句话说,假设您在处理传入请求的负载平衡器后面有 10 台服务器。用户 1 发出服务器 A 处理并登录的请求。您需要存储他们已登录的事实,以便将其存储在会话中。下一个请求最终被路由到服务器 C,因为服务器 A 正忙于另一个请求。为了让服务器 C 知道用户已经登录,它需要会话数据。那么它是如何访问服务器 A 存储的会话数据的呢?
一种方法是将数据存储在客户端的 cookie 中,该 cookie 随每个请求一起提交,但这不是很安全。另一种方法是尝试在 Node 服务器之间同步状态,这可以做到,但成本高且容易出错。最简单的方法是将会话 ID 存储在 cookie 中,然后将实际会话数据存储在数据库中。然后每个节点服务器都可以访问相同的数据库,以便他们可以查找会话数据。通过这种方式,您可以轻松地扩展和扩展 Node 服务器,并在服务器出现故障时对其进行负载平衡,而不会丢失任何数据。
就性能而言,内存存储将是最快的(但有上述缺点)。 Redis 将是第二快的,而 MongoDB 将是最慢的(通常比 Redis 慢 4 倍左右)。请记住,对于绝大多数网站来说,任何一个都足够快。
【讨论】: