【发布时间】:2025-12-03 07:10:01
【问题描述】:
基于此答案的问题:https://*.com/a/18650183/4478897
我试图找到这个解决方案,但似乎没有什么能按我需要的方式工作。
集群expressjs和socket.io我们可以使用redis共享会话并在io世界(io.sockets.on('connection',...)中发送io消息。问题是我们是否想在expressjs 世界(route.get/post)中发送消息(或使用简单的socket.join/leave)。
如果我们不使用集群,我们可以将客户端 socket 对象附加到 express request 对象(或简单地将 export io 对象),然后在任何 GET/POST 路由上随时使用它.
另一方面,如果我们进行聚类并使用上述方法获取expressjs 世界中的socket 对象,则有时socket 对象未定义,因为此客户端的socket 对象已初始化在其他worker。
一些示例流程:
- 客户端连接到http://localhost,
worker 1处理此请求。 - 页面加载后,客户端连接到
socket.io。Worker 2处理此连接。 - 客户端执行 POST 并再次
worker 1或worker X处理此请求。
在这种情况下,当客户端执行 POST 时,只有 worker 2 知道此客户端的 socket 对象。所以这将得到一个未定义的socket 对象。
那么问题来了:
我们如何从任何worker 获取客户端socket 对象以在expressjs request 对象上重用它。
也许我的代码是错误的,但几乎就像上面提到的答案的链接。
注意事项
- 不想使用某种代理。
- 不想迁移到其他库(expressio、sockjs...)
- 对不起我的英语:)
使用最后的nodejs、socket.io、expressjs、socket.io-redis、redis...版本
请不要犹豫!
更新 1
可能的解决方案,但仍需要测试。不知道这是否真的很好:解决方案。
- 更新 3:我自己回答的工作代码
更新 2
与更新 1 类似,但使用 https://nodejs.org/dist/latest-v5.x/docs/api/cluster.html#cluster_event_message
【问题讨论】:
标签: node.js express redis socket.io cluster-computing