运行 使用 Socket.io 的多项服务的最佳方式是什么

What is the best way to run multiple services that use Socket.io

我正在开发一个将使用微服务的网站。

我将有几个或多个 Node.js 应用程序将使用 Socket.io。

我在想我将如何构建它。

我可以使用多个 Node.js 和 Socket.io 连接到一个用户,还是会 运行 发生冲突?我可以使用 NGiNX 作为 UUID 的代理来识别将请求发送到哪个微服务。这有意义吗?有没有更好的方法?

或者我也在考虑使用 Node.js 有一个代理,它接收所有 Socket.io 连接,然后它创建与用户的连接。但这似乎增加了网络负载,因为我正在添加另一个微服务。

无论如何,我希望您对此有看法。

根据项目的进展情况,通过 Socket.io

构建微服务通信可能是也可能不是一个好主意

首先想到的是 socket.io 消息系统的糟糕保证,尤其是您的消息没有存储在磁盘上。虽然这可能很方便,但在构建审计跟踪、调试或可重播性方面,这也是一个真正的问题。

我看到的另一个问题是 scalability/cluster-ability:是的,您可以让多个服务通过一个 nodeJS 代理进行通信,但是当您必须添加更多服务时会发生什么?您将如何将消息从一个经纪人传递到另一个经纪人?这将引导您构建一个完整的消息系统,并且您会发现使用现有的解决方案(RabbitMQ、Kafka...)更安全

您可以设置多个 nodejs 服务,并且所有服务都使用 socket.io-redis lib 连接到 Redis 服务器以共享所有 nodejs 服务的 socketID。这意味着您将所有 套接字信息 存储在 Redis 服务器上。当您发出事件时,它们会自动发出到所有 nodejs 服务。

const server = require('http').createServer();
const io = require('socket.io')(server);
const redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

io.on('connection', socket =>{
  // put socket of user to a room name by user_id
  socket.join(user_id);
});

// emit an event to a specify user, all nodejs keep that user connection will be emit
io.to(user_id).emit('hello', {key: 'ok'})