服务端是Socket.io的集群,供客户端(Web、移动端)连接。集群后面是一个Redis服务器,保存集群中每个节点(我们称之为Cluster)连接的客户端ID。同时Redis里面为每一个Cluster分配了一个队列,保存推送到这个Cluster的消息。
当有消息从某个客户端发出后,所连接的Cluster从Redis里面获取这个消息的目标客户端ID(由于我们同时支持一对一私聊和群组,因此一条消息可能会被推送到多个客户端),然后把消息Push到每个Cluster的消息队列里面。
每一个Cluster都会以阻塞方式读取它所对应的消息队列,一旦发现有消息,就获取并且查看其目标客户端ID是不是连接在这个Cluster上。如果是,就通过Socket.io发送;如果不是就丢弃。然后继续阻塞读取,直到下一条消息到达。
对于Cluster间如何互通,也可以考虑使用Redis的Pub/Sub。如果没有特殊的场景,推荐用Socket.io自带的 GitHub - socketio/socket.io-redis: Adapter to enable broadcasting of events to multiple separate socket.io server nodes.