我正在开发一个网站,我将使用微服务。
我将有几个或更多将使用Socket.io的Node.js应用程序。
我试图弄清楚我将如何构建这个。
我可以将多个Node.js与Socket.io连接到用户使用,还是会遇到冲突?我可以使用NGiNX作为UUID的代理来识别发送请求的微服务。这有什么意义吗?还有更好的方法吗?
或者我也在考虑使用Node.js有一个接收所有Socket.io连接的代理,然后它与用户建立连接。但这似乎增加了网络负载,因为我正在添加另一个微服务。
无论如何,我很乐意看到你对此的看法。
答案 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'})