使用非连接默认会话存储有什么好处?

时间:2012-05-06 01:46:50

标签: session node.js redis express

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

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

1 个答案:

答案 0 :(得分:12)

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

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

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

就性能而言,内存存储将是最快的(但具有上述缺点)。 Redis将是下一个最快的,而MongoDB将是最慢的(通常比Redis慢大约4倍)。请记住,对于绝大多数网站来说,要么足够快,要么足够快。