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

时间:2017-06-18 21:19:51

标签: node.js sockets websocket socket.io microservices

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

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

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

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

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

无论如何,我很乐意看到你对此的看法。

2 个答案:

答案 0 :(得分:2)

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

首先想到的是socket.io消息传递系统的不良保证,尤其是您的消息未存储在磁盘上的事实。虽然这可能很方便,但在构建审计跟踪,调试或重放性方面,这也是一个真正的问题。

我看到的另一个问题是可伸缩性/集群能力:是的,您可以通过一个nodeJS代理进行多个服务通信,但是当您需要添加更多服务时会发生什么?您如何将消息从一个经纪人传递给另一个经纪人?这将引导您构建整个消息系统,您会发现使用现有解决方案更安全(RabbitMQ,Kafka ...)

答案 1 :(得分:2)

您可以设置多个 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'})