【发布时间】:2019-01-02 02:30:32
【问题描述】:
我正在使用 socket io 的配置,redis 作为缓存,rabbitMQ 用于 pub sub 和 mongo DB 作为聊天应用程序的辅助存储。基本上,redis 用作存储来设置连接的用户状态为在线或离线、用户对话 ID、参与者和更多数据点。在我的用例中,可能有多个用户使用相同的用户 id 连接,但有多个套接字连接,所以我在用户上保留一个计数器作为 redis 上的哈希,并在每次用户连接时使用相同的 id 连接时递增它。
在
socket.on('disconnect')
事件我正在编写递减计数器逻辑,如果与相同用户 ID 连接的套接字数量为 4,则将其设置为 3,如果为 1,则将其设置为 0,并且将用户设置为脱机。问题是,如果我的服务器停止,则不会触发 on disconnect 事件,并且下次当服务器启动时会建立一个新连接并且计数器会增加,例如它连接了 3 个套接字,那么它将使其变为 4 .我计划通过在 redis 上保留一组所有连接的用户来解决它,当服务器出现故障时,我正在编写一些清理代码
process.on('exit')
它将从 redis 集合中读取所有已连接用户的集合,并将它们设置为离线并计数为 0。这样当服务器恢复时,所有客户端都可以开始增加计数。
问题 - 我计划将它部署在 amazon elastic beanstalk 上,所以当它扩展流量时,我将不得不维护一组特定于机器的用户连接,这样当节点关闭时,它只会设置连接到该用户的状态节点离线,计数为 0。
仅供参考 - 我已经编写了一个回退机制,如果它在 redis 上找不到数据点,它将查询 mongoDB 并将其设置在 redis 上。因此,当服务器出现故障时,我可以清除 redis 并让它自行重新填充。但我不想清除 redis,因为从长远来看,它在大规模重新填充方面效率低下。
非常感谢您抽出宝贵时间。
【问题讨论】:
标签: node.js amazon-web-services redis socket.io amazon-elastic-beanstalk