Gleasy的分布式即时通讯中间件CloudIM

声明
本文为Gleasy原创文章,转载请指明引自Gleasy团队博客

一。CloudIM是什么
CloudIM,字面意思是即时消息中间件。通俗一点可以理解为一套推送服务,就像APNS(苹果推送通知服务)。它主要以下三件事情:建立和保持长连接(SOCKET),维护及实时通知用户(好友之间,房间内部)状态变更(离线,在线,忙碌,PC在线,手机在线,平板在线等等),充当消息中转站–应用服务器通过它把消息实时推送给客户端。

二。产生的背景
Gleasy有众多需要实时通讯的场景,比如一说(即时通讯工具),消息中心,表格(实时协同办公)。这些场景对实时要求非常高,定时拉取(PULL)的方式由于延迟问题往往不能很好地满足这些业务场景,很有必要维护SOCKET连接。
最先选取的方案是基于XMPP的Openfire,在它基础上轻松地扩展出了满足我们业务场景的上层协议。不过用一段时间就慢慢暴露出致命的问题,首先是单点问题,Openfire没有集群,结点一挂,服务立刻终止;其次是使用MYSQL作存储,性能真心一般,在线人数过万就基本上跑不动了;再次是业务级问题,GLEASY的在线状态和房间,跟XMPP协议标准有很大区别,最明显的区别是XMPP协议的CHAT ROOM的在线状态是进入了房间内的房间内在线,而我们需要的是统一的在线状态,不管进没进房间。
研究过OPENFIRE的集群插件,一是要收费,二是性能确实也不咋地,加上始终无法满足我们对于在线状态的要求,果断放弃,准备自主研发。
从零开始,似乎有些浪费,毕竟OPENFIRE维护连接和结点间通讯的能力还是很不错的。保留Openfire的这两点能力,其它的全部被替换掉。我们对这个中间件的要求有几点:
1. 无单点故障,任何一个结点挂掉,只要资源充足,都不会对用户体验造成任何影响。
2. 负载均衡,所有结点都可以直接对外提供服务(根据配置高低分配连接数量),不采用主备方案。
3. 可以随时增加新的结点进来,无须停服务
4. 总用户数量支持到亿级别而数据库依然坚挺
5. 同时在线数量可以支持到百万级别以上

三。架构设计
1. 软件架构
Openfire作为连接保持服务器
Java作为插件开发语言
Zookeeper用于维护结点状态
redis用于存储用户信息,房间信息,好友关系

2. 主体架构图

四。部分业务场景流程
1. 结点启动(新加入)
a. 启动
b. 向ZK注册本结点信息(IP,域名,端口,最大可容纳连接数)

2. 连接建立
a. 向集群内任意一结点发送查询命令
b. 结点收到命令,查找集群内所有存活结点,找到使用率最低的那个,返回结点信息给客户端
c. 客户端根据收到的结点信息,取出域名及端口,发起连接请求
e. 目标结点收到连接请求,建立连接,保存连接信息,并将连接数加1
f. 客户端连接断开或者建立不成功,重复a-e步骤

3. 连接断开
a. 己连上的结点监测到连接断开信息
b. 更改断开用户的在线状态
c. 将新的状态推送给所有在线好友
d. 将新的状态推送给所有TA已经进入的ROOM
e. 删除连接信息,连接数减1

4. 结点挂掉
a. 主结点监测到结点挂掉事件
b. 将已经连接到该结点的所有连接信息清除
c. 将挂掉结点的在线人数置0

5. 发送消息
a. 应用服务器调用cloudim的API,将发送消息命令发送给其中一结点(随机)
b. 结点收到命令,找出当前用户的连接信息,调用openfire接口,将消息以XMPP协议推送至客户端

五。性能测试
以下是服务器端调用CLOUDIM的API的性能报告
创建用户 tps best online casino 17000-19000
更新用户 tps 25000-27000
删除用户 tps 27000-35000
获取用户 tps 25000-27000
创建双向好友 tps 17000-19000
删除双向好友 tps 18000-19000
创建房间 tps 5500-6500
销毁房间 tps 5500-6500
加入房间 tps 5500-7500
批量加入房间 tps n*2500(n为一次加入的用户数,用户数越多,tps越高)
退出房间 tps 6000-8000
进入房间 tps 8000-9000
离开持久房间 tps 8000-10000
离开临时房间 tps 2000左右
获取房间成员 25000-27000
获取在线成员 25000-27000

结合线上实际情况和测试结果,CloudIM在单台服务器环境表现相当优秀,结合动态集群,完全可以承担得起大规模并发实时系统的需求.

此条目发表在 Java技术, 分布式技术 分类目录。将固定链接加入收藏夹。

Gleasy的分布式即时通讯中间件CloudIM》有 1 条评论

  1. Pingback 引用通告: Gleasy分布式架构体系介绍 | Gleasy团队博客

发表评论