一种IM集群中的多级消息广播方法及系统技术方案

技术编号:18449111 阅读:86 留言:0更新日期:2018-07-14 12:04
本发明专利技术公开了一种IM集群中的多级消息广播方法及系统,用户连接IM节点并上报房间号;消息中间件MQ给IM节点发送房间号为上述房间号的消息;IM节点收到消息后,查找该房间号下面的所有用户列表,再依次通过socket套接字把消息发送给所述用户。本发明专利技术无需查找全局用户表,只需要查找单个IM节点上面的用户列表,因此彻底解决了分发延迟的问题;节点间无任何关联,所以集群扩容非常简单;本发明专利技术采用二级分发方式,轻易即可达到千万级集群规模。

【技术实现步骤摘要】
一种IM集群中的多级消息广播方法及系统
本专利技术涉及IM消息分发领域,特别是一种IM集群中的多级消息广播方法及系统。
技术介绍
Emqttd是国内用Erlang/OTP实现mqtt协议进行消息分发的分布式框架。该框架在用户规模达到千万并且集群机器多的时候,会带来集群之间用户表数据同步的问题。在进行大批量的消息转发的时候,分发的节点需要对该房间所有的用户进行遍历、再进行转发、延迟高、效率比较低。云巴是基于MQTT协议实现的实时通信系统,采用Erlang/OTP的架构设计。在云巴,消息的发布过程为,首先在接收到任务请求后,会发布任务计算UID列表分片,对总任务进行分片处理。之后将分片任务分发给任务池,执行各个分片任务。最后,发布任务汇聚请求。其缺点是虽然优化了房间内用户遍历的问题,但是同样需要对uid位于哪个集群进行计算。用go实现连接服务器,采用kafka开源库进行集群中的消息分发,但是未提及分发算法。综合上述分析可知,现有技术中存在以下问题需要解决:1)分发延迟问题。传统的im在广播消息的时候,需要对房间内的所有用户进行遍历。然后给房间内的用户发送消息。房间内人数多的时候--例如1000万,传统方案会带来消息分发的延迟。2)全局表维护问题。对于集群来说,需要单独的服务维护一个全局的用户列表。用户登录时会导致全局的用户列表会有变动,同时也会限制登陆的速度。3)不易扩容问题。对类似于emqttd这样的软件结构来说,每个节点都需要复制一份全局的用户结构表。
技术实现思路
本专利技术所要解决的技术问题是,针对现有技术不足,提供一种IM集群中的多级消息广播方法及系统,降低消息分发延迟,简化集群扩容,扩大集群规模。为解决上述技术问题,本专利技术所采用的技术方案是:一种IM集群中的多级消息广播方法,包括以下步骤:1)用户Uid1连接IM1节点并上报房间号RoomId1,用户Uid2连接IM1节点并上报房间号RoomId2,用户Uid3连接IM1节点并上报房间号RoomId1,用户Uid4连接IM2节点并上报房间号RoomId1;2)消息中间件MQ同时给IM1节点和IM2节点发送房间号为RoomId1的msg1消息,消息内容简写为{RoomId1,msg1};3)IM1节点收到消息{RoomId1,msg1}后,查找RoomId1下面的所有用户列表,再依次通过socket套接字把消息msg1发送给用户Uid1和用户Uid3;IM2节点收到消息{RoomId1,msg1}后,查找RoomId1房间下的用户列表,IM2节点通过socket套接字把msg1消息下发给用户Uid4。步骤1)中,各用户连接相应节点并上报房间号的具体操作过程包括:用户Uid连接IM节点,并订阅自己所在的房间号RoomId,被连接的IM节点判断维护的用户列表RoomUidList中是否存在RoomId的键key;如果有,把该用户Uid加入到RoomId结构对应的set数据结构中;如果没有,用户列表RoomUidList创建一个新的键值对,其中键key为RoomId,值value为空的set数据结构,并且把Uid加入到RoomId指向的set数据结构中;其中用户Uid是指用户Uid1,Uid2,Uid3和用户Uid4;IM节点是指IM1节点和IM2节点。步骤3)之后,还执行如下操作:用户Uid1,Uid2,Uid3退出IM1节点,用户Uid4退出IM2节点。本专利技术中,用户退出相应节点的具体实现过程为:用户Uid找到该用户Uid对应的RoomId并从RoomId中删除这个用户Uid。由于进入房间不需要在全局表上增加数据,而是在单个IM节点维护的数据表上增加数据,所以本专利技术的加入和退出操作相对现有的全局表方案速度更快。相应地,本专利技术还提供了一种IM集群中的多级消息广播系统,其包括:用户Uid1,用于连接IM1节点并上报房间号RoomId1;用户Uid2,用于连接IM1节点并上报房间号RoomId2;用户Uid3,用于连接IM1节点并上报房间号RoomId1;用户Uid4,用于连接IM2节点并上报房间号RoomId1;消息中间件MQ,用于同时给IM1节点和IM2节点发送房间号为RoomId1的msg1消息,消息内容简写为{RoomId1,msg1};消息收发单元,用于在IM1节点收到消息{RoomId1,msg1}后,查找RoomId1下面的所有用户列表,再依次通过socket套接字把消息msg1发送给用户Uid1和用户Uid3;IM2节点收到消息{RoomId1,msg1}后,查找RoomId1房间下的用户列表,IM2节点通过socket套接字把msg1消息下发给用户Uid4。还包括:退出单元,用于在消息收发单元操作完成后,使用户Uid1,Uid2,Uid3退出IM1节点,用户Uid4退出IM2节点。与现有技术相比,本专利技术所具有的有益效果为:本专利技术无需查找全局用户表,只需要查找单个IM节点上面的用户列表,因此彻底解决了分发延迟的问题;节点间无任何关联,所以集群扩容非常简单;本专利技术采用二级分发方式,轻易即可达到千万级集群规模。附图说明图1为本专利技术IM节点中RoomMap数据结构;图2为本专利技术IM节点中RoomUidList数据结构;图3为本专利技术用户登录流程图;图4为本专利技术用户退出流程图;图5为本专利技术消息分发流程图。具体实施方式1)IM节点中RoomMap数据结构详细说明对照图1。每个IM节点维护一张Uid与RoomId对应的map映射表,命名为RoomMap,后面以RoomMap表示。这个结构用于存储该用户位于哪个房间,RoomMap为多对一的关系,多个Uid可以映射到同一个RoomId。2)IM节点中RoomUidList数据结构详细说明对照图2。RoomUidList为map数据结构,key为RoomId,也就是房间号,value为set,set中的数据为Uid。该结构用于存储房间内有哪些用户,假设Uid1、Uid2、Uid3属于房间号RoomId1,Uid4、Uid5属于RoomId2,Uid6属于RoomId3。那么其数据结构就如图2所示。3)用户加入房间算法步骤描述用户Uid连接IM节点:并且订阅自己所在的房间号RoomId。被连接的IM判断维护的RoomUidList中是否存在RoomId的key。如果有,把该用户Uid加入到RoomId结构对应的map中。如果没有,RoomUidList创建一个新的keyRoomId,value为空的map,并且把Uid加入到RoomId指向的map中。uid1加入到RoomId1步骤演示如下(参照图3):步骤1:增加映射关系uid1->RoomId1;步骤2:找到RoomId1下的Uid列表,将Uid1添加到RoomId1所指set。如果不存在RoomId1,创建新的RoomId1和RoomId1所对应set,并且把Uid1加入到set。4)用户退出房间算法步骤描述用户Uid退出IM节点:找到Uid对应的RoomId并从RoomId中删除这个Uid。步骤演示如下:(参照图4)步骤1:通过Uid1找到对应的RoomId1并且找到RoomId1对应set,删除Uid1。如果删除后set为空,删除R本文档来自技高网...

【技术保护点】
1.一种IM集群中的多级消息广播方法,其特征在于,包括以下步骤:1)用户连接IM节点并上报房间号;2)消息中间件MQ给IM节点发送房间号为步骤1)中房间号的消息;3)IM节点收到消息后,查找该房间号下面的所有用户列表,再依次通过socket套接字把消息发送给所述用户。

【技术特征摘要】
1.一种IM集群中的多级消息广播方法,其特征在于,包括以下步骤:1)用户连接IM节点并上报房间号;2)消息中间件MQ给IM节点发送房间号为步骤1)中房间号的消息;3)IM节点收到消息后,查找该房间号下面的所有用户列表,再依次通过socket套接字把消息发送给所述用户。2.根据权利要求1所述的IM集群中的多级消息广播方法,其特征在于,所述用户数量为4个,所述IM节点数量为2个;执行步骤1)时,第一用户Uid1连接IM1节点并上报房间号RoomId1,第二用户Uid2连接IM1节点并上报房间号RoomId2,第三用户Uid3连接IM1节点并上报房间号RoomId1,第四用户Uid4连接IM2节点并上报房间号RoomId1。3.根据权利要求2所述的IM集群中的多级消息广播方法,其特征在于,执行步骤2)时,所述消息中间件MQ同时给IM1节点和IM2节点发送房间号为RoomId1的msg1消息,消息内容简写为{RoomId1,msg1}。4.根据权利要求3所述的IM集群中的多级消息广播方法,其特征在于,执行步骤3)时,IM1节点收到消息{RoomId1,msg1}后,查找RoomId1下面的所有用户列表,再依次通过socket套接字把消息msg1发送给第一用户Uid1和第二用户Uid3;IM2节点收到消息{RoomId1,msg1}后,查找RoomId1房间下的用户列表,IM2节点通过socket套接字把msg1消息下发给第四用户Uid4。5.根据权利要求1所述的IM集群中的多级消息广播方法,其特征在于,步骤1)中,用户连接IM节点并上报房间号的具体操作过程包括:用户Uid连接IM节点,并订阅自己所在的房间号RoomId,被连接的IM节点判断维...

【专利技术属性】
技术研发人员:陈一鸣贺周州田魁殷伟雄
申请(专利权)人:湖南快乐阳光互动娱乐传媒有限公司
类型:发明
国别省市:湖南,43

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1