前言
一个IM产品,如果要支持亿级用户在线,集群是没法绕过的坎,三年前就在思考这个IM集群的事儿,也一直在等待某位大神能提供一颗开源银弹来解决这个问题,左等右等,没等到其它大神的答案,倒是等来了自己的灵光闪现,今年夏天自己耗时20天编码完成了心中的集群构想。
IM集群的难点
IM集群的难点主要由以下两个场景导致
- 群发消息时,这个群的用户会分散在不同的IM服务器上
- 给某用户发消息时,这个用户的PC、App端可能分布在不同的服务器上
以上两个问题,归根到底就是消息路由的问题,有一个简单暴力的做法是用topic来绕开路由算法的问题,但topic对服务器性能影响太大了,因为所有消息都要走一下消息中心服务器,消息中心服务器然后再分发到其它IM服务器
IM集群的两件事
集群的完整实现,归纳起来就两件事
- 为客户端选择IM服务器
- 客户发消息时,把消息路由到对应的IM服务器,再由IM服务器分发消息给指定的客户端
谭聊的集群架构和流程
1. 选择IM服务器
2. 消息路由
结束语
有的设计师能把复杂的事简单化,有的设计师能把简单的事复杂化,希望各位读者看完本篇文章后,能豁然开朗。当然啦,架构图虽然简洁明了,但内部算法还是相对复杂的,对socket编程、多线程、锁不熟练的同学,不建议将本架构图落地为代码(低调地提示:企业版t-io的集群版已经在框架层实现了集群)