gpt4 book ai didi

node.js - socket.io+redis+expressjs 集群 - 在 expressjs 请求中获取套接字对象

转载 作者:IT王子 更新时间:2023-10-29 05:58:36 32 4
gpt4 key购买 nike

基于此答案的问题:https://stackoverflow.com/a/18650183/4478897

我试图找到这个解决方案,但似乎没有任何效果符合我的需要。

集群 expressjssocket.io 我们可以使用 redis 共享 session 并在 io 世界中发送 io 消息(io.sockets.on('connection',...)。问题是如果我们要发送消息(或使用简单的 socket.join/leave ) 在 expressjs 世界中 (route.get/post)。

如果我们不使用集群,我们可以将客户端 socket 对象附加到 express request 对象(或者简单地export io 对象),然后随时在任何 GET/POST 路由上使用它。

另一方面,如果我们进行集群并使用上述方法获取 expressjs 世界中的 socket 对象,有时 socket 对象未定义,因为此客户端的 socket 对象已在其他 worker 中初始化。

一些示例流程:

  • 客户端连接到 http://localhost worker 1 处理这个请求。
  • 页面加载后,客户端连接到 socket.ioWorker 2 处理这个连接。
  • 客户端执行 POST,然后 worker 1worker 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

最佳答案

remoteJoinremoteLeave 方法在 socket.io-redis 3.0.0 中添加:

io.adapter.remoteJoin('<my-id>', 'room1', function (err) {
if (err) { /* unknown id */ }
// success
});

io.adapter.remoteLeave('<my-id>', 'room1', function (err) {
if (err) { /* unknown id */ }
// success
});

注意:实现看起来很像(希望如此?)答案 above .

关于node.js - socket.io+redis+expressjs 集群 - 在 expressjs 请求中获取套接字对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35313377/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com