【问题标题】:How to share session across server in nodejs?如何在nodejs中跨服务器共享会话?
【发布时间】:2016-10-26 05:11:00
【问题描述】:

我想创建一个无状态服务器,以便如果任何服务器出现故障,负载均衡器可以将请求重定向到其他服务器。但是,如果会话是在一台服务器上创建的并且它关闭了,那么如何持久化它。我正在使用 mysqlstore 将我的会话持久化在数据库中,但是对于每台服务器,它都会在数据库中创建一条新记录,因此会话 ID 不会共享不同的服务器。因此,需要一种使服务器无状态的机制。

【问题讨论】:

  • 根据定义,无状态应用程序不会维护会话。会话是状态。你确定你问的是正确的问题吗?
  • 如果服务器出现故障,您不必担心重定向。 AWS ELB 自动将其标记为不健康,并将流量发送到连接到负载均衡器的另一个健康服务器。
  • @error2007s 如果实例关闭,会话粘性对用户没有帮助,这是 OP 试图解决的问题。
  • 我建议应用程序控制会话粘性,因此粘性将取决于应用程序生成的 cookie。因此,如果服务器出现故障,则该服务器没有 cookie。

标签: mysql node.js session amazon-web-services


【解决方案1】:

我猜您使用的是express-session,因为没有另外指明。

您在 mysqlstore 上走在了正确的轨道上。解决 Node 单线程问题的方法是放弃 express-session,而是加密会话数据并将其放入客户端 cookie。然后,您可以解密 GET 请求上的会话数据,并使用 cookie 中的隔离键在您的数据库中对其进行验证(如果不存在,则创建一个新的会话/cookie 对)。

最流行的 Node.js 中间件是 cookie-session. 那里也有很棒的文档。

https://github.com/expressjs/cookie-session

附带说明,因为听起来您现在处于一个具有多台服务器的可扩展性很强的地方,所以无论如何都值得放弃express-session。 express-session 使用 MemoryStore,这是一个已知的内存泄漏问题。可以用于较小的项目,但可能应该重新考虑用于较大的项目。

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2019-01-21
    • 2016-06-17
    • 2011-08-20
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多