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

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

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

我试图弄清楚我将如何构build这个。

我可以使用多个Node.js与Socket.io连接到用户,还是会遇到冲突? 我可以使用NGiNX作为UUID的代理来识别发送请求的微服务。 这是否做出敏感? 有没有更好的办法?

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

无论如何,我会喜欢你的意见。

根据你的项目的进展情况,通过Socket.io构build微服务通信可能也可能不是一个好主意

首先想到的是socket.io消息系统的可靠保证,尤其是消息不存储在磁盘上。 虽然这可能很方便,但在构build审计线索,debugging或重放时,这也是一个真正的问题。

我看到的另一个问题是可伸缩性/集群能力:是的,您可以有多个服务通过一个nodeJS代理进行通信,但是当您需要添加更多内容时会发生什么? 你如何将这个信息从一个经纪人传递给另一个经纪人? 这将导致你build立一个完整的消息系统,你会发现更安全的使用已有的解决scheme(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'})