Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am developing a website where I will use microservices.

I will have a couple or more Node.js application that will use Socket.io.

I was trying to figure out how I will architecture this.

Can I use multiple Node.js with Socket.io connecting to a user or will I run into conflicts? I can use NGiNX as a proxy a an UUID to identify which microservice to send the request to. Does that make sens? Is there a better way?

Or I was also thinking of using a Node.js has a proxy that receives all the Socket.io connection and then it creates a connection with the user. But this seems to be adding to the network load because I am adding a another microservice.

Anyways, I would love your views on this.

like image 217
jnbdz Avatar asked Nov 30 '25 06:11

jnbdz


2 Answers

You can setup multi nodejs services and all of them using socket.io-redis lib connect to a Redis server to share socketID of all nodejs services. That mean you storage all socket info on Redis server. When you emit an event they will automatically emit to all nodejs services.

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'})
like image 81
Quang Công Lê Avatar answered Dec 02 '25 19:12

Quang Công Lê


Depending of how your project goes, it might or might not be a good idea to build microservices communication over Socket.io

The first thing that comes to mind are the poor guarantees of the socket.io messaging system, especially the fact that your messages are not stored on disk. While this might be convenient, this is also a real problem when it comes to building audit trails, debugging or replayability.

Another issue I see is scalability/cluster-ability: yes you can have multiple services communicating over one nodeJS broker, but what happens when you have to add more? How will you pass the message from one broker to the other? This will lead you to building an entire message system and you will find safer to use already existing solutions (RabbitMQ, Kafka...)

like image 39
Fabien Avatar answered Dec 02 '25 19:12

Fabien