Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strategy to implement a scalable chat server

I am looking to implement some sort of chat server. And I want it to scale. This seems like a big question, so I guess I expect the answers to be direction pointers, sort of exploratory.

The end-user clients are web or phone client. I think some sort of websocket implementation, such as Socket.IO is nice.

On the server side I wish to use Node.js. I want the architecture to be scalable so that the number of users are not limited (well, within reason, the chance of big hit is not expected, and if it is, the chance of having smarter, experienced people to work on it is reasonable instead of currently just me coding) The number of users per chatroom is hopefully not limited, or maybe some fixed large number. And that means I need to scale horizontally using several servers written in Node.

Suppose some load balancer (and hopefully in the future not a single point of failure, but I don't know how I would achieve that, or maybe just move to AWS) are dispatching SocketIO connections from the end clients to the chat servers. Different users connection to different servers may be in the same room, so the messages need to be send to other servers.

How would I feasibly implement something like this? Hopefully not too complex.

Questions: (1) If all servers need to handle all messages as users can be logged on via any of the servers, does this scale? (2) Do I need some sort of message queue for the servers to talk among them? Is Pub-sub from Rabbitmq usable for this? Or if zeromq, how would I scale with pub sub? The Zeromq guide is has explanations for scaling to more than one server with REQ/REP type of applications. But not Pub Sub. (3) Or should I start with XMPP?

I am hoping to make it work as easy as possible.

like image 542
huggie Avatar asked Nov 28 '14 09:11

huggie


1 Answers

There's a rather good explanation at the Socket.io site. Have a look at

  • http://socket.io/docs/using-multiple-nodes/

It suggests using Nginx as HTTP load balancer, Node.js clustering (with sticky sessions) and Redis as the message backend.

I think your goals should be achievable with little to none coding involved, only using the given modules and configuration mechanisms.

like image 94
Tobi Avatar answered Nov 04 '22 23:11

Tobi