默认
打赏 发表评论 13
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?别走弯路了... 找站长给点建议
移动端IM中大规模群消息的推送如何保证效率、实时性?
阅读(172043) | 评论(13 收藏9 淘帖2
扫一扫关注!

本文原题为“大规模群消息推送如何保证实时性?”,来自瓜子二手车IM负责人:封宇,本次内容有修订,感谢原作者(原文链接在文末)。


1、编者注


众所周之,群聊是移动端IM的服务端技术难点所在,难在哪?大量的群聊消息,是一条条推给群内成员还是可以使用什么样的优化策略?试想一个2000人大群,一条消息的发出,如果瞬间被扩散写成2000条一对一消息的投递,对于接收方而言不过是一条消息而已,而服务端是以对相对比单聊消息的2000倍处理压力后的结果。那么服务端在保证消息投递的同时,面对这么大的压力该如何解决好效率问题?解决不好效率问题那实时性就不能保证!

当然,实际在生产环境下,群消息的发送都会想尽办法进行压缩,并开展各种改善性能的处理办法,而不是像上述举例里的直接扩散写(即2000人群里,一条消息被简单地复制为2000条一对一的消息投递)。具体有哪些优先策略?本文或许可以带给你一些启发。

封宇分享的其它IM技术资料:


2、相关资料



3、本文背景


公司IM的第一版红包功能上线后,收集到不少问题。核心问题是消息延迟,导致群里有些人先看到红包,有些人晚看到红包,同时导致消息顺序混乱。这是个典型的群聊消息优化问题。

4、问题产生的原因


先大致分析一下问题产生的原因。

1)消息量瞬间大增:
抢红包时大家都比较活跃,不停在群里发消息,尤其群成员比较多的群(500人),每条消息都会给服务端带来大量的计算工作。

2)后台逻辑不够优化:
比如红包消息没有单独的通道,时效性会收到其他消息影响、没有采用批处理方式、异步处理有些环节还不到位等等。

5、优化前的系统架构和消息处理流程


先看一下系统架构和消息处理流程(如下图) :
移动端IM中大规模群消息的推送如何保证效率、实时性?_1.jpg

(本文作者在另一篇文章《一套海量在线用户的移动端IM架构设计实践分享(含详细图文),对这个架构作了详细记录和总结,有兴趣的同行可以前往阅读。)

6、精确定位问题的原因


回顾我们的架构设计(见上节中的大图),我们尝试精确定位问题的根本原因,原因分析如下。

1)c2g模块没有采取批处理方式:
1条群(500人群)消息到达c2g模块后,c2g模块为每个人写收件箱(这里时间延迟较大,优化点),然后在把这条消息变成500条投递消息(需要批处理,就给Kafka放入一条消息),通过Kafka送给Deliver节点投递。

2)Deliver模块的处理没有批量合并:
Deliver模块会到Redis中逐条(500条)检索接收消息用户的在线状态(这个点需要批处理,根据用户Id分布,一次检索若干用户的在线状态),在线的投递消息(批处理),离线的发送第三方push(批处理)。

3)离线推送流程不优化:
整体流程上,每条消息是先写了离线收件箱,再推送。这样效率也不高,需要对这个流程细化以及异步化。

我们来看看微信在这个逻辑上的一些优化思想:
在微信团队分享的《微信后台团队:微信后台异步消息队列的优化升级实践分享》一文中,提到:
移动端IM中大规模群消息的推送如何保证效率、实时性?_212756nzkamr3lq3o9mkqp.png

上图是群消息投递业务的简化流程示意。随着微信群消息体量的高速膨胀,其带来的成本压力越来越大,业务同学提出了批量并行化的优化方式。简单来说,就是将每个步骤中产生的 RPC 访问按实际访问机器聚合成一系列的批量操作,然后并行化执行。  通常来说,单次的批量并行化并不难写,一般而言,业务同学可能会选择裸写。但如果涉及多次的批量并行化,其中还存在嵌套的话,事情就不那么简单了。最终代码将变得异常复杂,业务开发的同学苦不堪言。MQ 能否从框架上解决这类问题?


(具体内容详见文章《微信后台团队:微信后台异步消息队列的优化升级实践分享》)

总结一下就是:
微信在这块的一个重要优化思想是批处理,做法是单次批量操作(我们本次优化目标)裸写,多条消息的聚合(MapReduce过程)下沉到了MQ中间件中。

7、我们具体怎么做


7.1群聊红包逻辑单独部署


现阶段,当消息(尤其是大群消息)量大的时候,Deliver节点会成为瓶颈。红包对时效性要求很高,架构上采用独立为红包部署Deliver节点的方式确保红包消息走单独通道进行推送。即使其他消息出现延迟,红包消息依然能保证即使送达。

优化后的架构简述为下图所示:
移动端IM中大规模群消息的推送如何保证效率、实时性?_3.jpg

7.2裸写批处理逻辑


处理一条群消息,服务端要进行大量的工作,需要查询所有群成员的路由表、在线状态,在线人员需要推送及时消息,离线人员需要推送第三方push(比如iOS的apns推送通道)。这些工作逐条执行,性能会非常差,如果遇到大群,系统会不可用。

批处理可以较好解决这个问题。比如用户状态及路由表数据,采用hash算法分布在几台服务器上。收到群消息后,根据群成员,计算出用户状态及路由表数据的分布情况,从缓存服务器中一次检索出该服务器可能存在的所有群成员状态及路由信息。这样可以极大减少RPC调用次数,及计算量。

推送操作也类似,批量向接入层投递消息即可。

7.3离线消息异步写收件箱


在处理大群消息推送时,写离线消息也是一个非常影响性能的地方。现有的逻辑是先为每个人写一条离线消息,再执行推送。这样做的初衷是确保消息投递绝对可靠(参看《一个海量在线用户即时通讯系统(IM)的完整设计》的离线消息章节)。由于大群人数较多,写离线消息也有较多时间开销。

优化思路是现将消息及时推送给用户,再异步写离线消息,同时处理好写离线消息和推送消息的ack时序。

具体步骤如下图:
移动端IM中大规模群消息的推送如何保证效率、实时性?_4.jpg

对上图的解读如下:

  • 1)Deliver节点收到一条群消息,检索用户在线状态及路由信息,用户在线(离线的逻辑相对简单,略过);
  • 2)批量推送消息(2、批处理逻辑);
  • 3)异步将消息写入消息总线,同时写入第三方push的延迟推送任务;
  • 4)异步写离线消息(不影响在线用户收到消息的速度);
  • 5)第(2)步推送消息的ack信息回到服务端;
  • 6)c2g模块将ack信息放入消息总线。(确保消息时序性,ack需要在写离线消息之后处理,否则可能出现消息重复);
  • 7)删除对应的离线消息;
  • 8)第(3)步写入的延迟推送任务,在规定时间(如10秒)后生效,判断是否存在此条离线消息(如果ack回来了,离线消息会被删掉),如果离线消息还存在,发送第三方push。

通过以上3个方面的优化,能够确保在并发消息量较大时,推送消息依然及时。

(原文链接:https://mp.weixin.qq.com/s/2oT8bJaSnfH2Zxg8iLAc_A,内容有修订)

附录:更多IM架构设计资料


浅谈IM系统的架构设计
简述移动端IM开发的那些坑:架构设计、通信协议和客户端
一套海量在线用户的移动端IM架构设计实践分享(含详细图文)
一套原创分布式即时通讯(IM)系统理论架构方案
从零到卓越:京东客服即时通讯系统的技术架构演进历程
蘑菇街即时通讯/IM服务器开发之架构选择
腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT
微信后台基于时间序的海量数据冷热分级架构设计实践
微信技术总监谈架构:微信之道——大道至简(演讲全文)
如何解读《微信技术总监谈架构:微信之道——大道至简》
快速裂变:见证微信强大后台架构从0到1的演进历程(一)
17年的实践:腾讯海量产品的技术方法论
移动端IM中大规模群消息的推送如何保证效率、实时性?
现代IM系统中聊天消息的同步和存储方案探讨
IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?
IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议
IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
WhatsApp技术实践分享:32人工程团队创造的技术神话
微信朋友圈千亿访问量背后的技术挑战和实践总结
王者荣耀2亿用户量的背后:产品定位、技术架构、网络方案等
IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?
腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
以微博类应用场景为例,总结海量社交系统的架构设计步骤
快速理解高性能HTTP服务端的负载均衡技术原理
子弹短信光鲜的背后:网易云信首席架构师分享亿级IM平台的技术实践
知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路
IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
微信技术分享:微信的海量IM聊天消息序列号生成实践(算法原理篇)
微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)
新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践
一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践
阿里技术分享:深度揭秘阿里数据库技术方案的10年变迁史
阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路
社交软件红包技术解密(一):全面解密QQ红包技术方案——架构、技术实现等
社交软件红包技术解密(二):解密微信摇一摇红包从0到1的技术演进
社交软件红包技术解密(三):微信摇一摇红包雨背后的技术细节
社交软件红包技术解密(四):微信红包系统是如何应对高并发的
社交软件红包技术解密(五):微信红包系统是如何实现高可用性的
社交软件红包技术解密(六):微信红包系统的存储层架构演进实践
社交软件红包技术解密(七):支付宝红包的海量高并发技术实践
社交软件红包技术解密(八):全面解密微博红包技术方案
社交软件红包技术解密(九):谈谈手Q红包的功能逻辑、容灾、运维、架构等
社交软件红包技术解密(十):手Q客户端针对2020年春节红包的技术实践
社交软件红包技术解密(十一):解密微信红包随机算法(含代码实现)
社交软件红包技术解密(十二):解密抖音春节红包背后的技术设计与实践
社交软件红包技术解密(十三):微信团队首次揭秘微信红包算法,为何你抢到的是0.01元
即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?
即时通讯新手入门:快速理解RPC技术——基本概念、原理和用途
多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了
从游击队到正规军(一):马蜂窝旅游网的IM系统架构演进之路
从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结
从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践
IM开发基础知识补课(六):数据库用NoSQL还是SQL?读这篇就够了!
瓜子IM智能客服系统的数据架构设计(整理自现场演讲,有配套PPT)
阿里钉钉技术分享:企业级IM王者——钉钉在后端架构上的过人之处
微信后台基于时间序的新一代海量数据存储架构的设计实践
IM开发基础知识补课(九):想开发IM集群?先搞懂什么是RPC!
IM开发基础知识补课(十):大型IM系统有多难?万字长文,搞懂异地多活!
阿里技术分享:电商IM消息平台,在群聊、直播场景下的技术实践
一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等
一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等
从新手到专家:如何设计一套亿级消息量的分布式IM系统
企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
融云技术分享:全面揭秘亿级IM消息的可靠投递机制
IM开发技术学习:揭秘微信朋友圈这种信息推流背后的系统设计
阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路
阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践
阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践
阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化
阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践
阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计
阿里IM技术分享(九):深度揭密RocketMQ在钉钉IM系统中的应用实践
基于实践:一套百万消息量小规模IM系统技术要点总结
跟着源码学IM(十):基于Netty,搭建高性能IM集群(含技术思路+源码)
一套十万级TPS的IM综合消息系统的架构实践与思考
直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
得物从0到1自研客服IM系统的技术实践之路
海量用户IM聊天室的架构设计与实践
企业微信针对百万级组织架构的客户端性能优化实践
小红书万亿级社交网络关系下的图存储系统的架构设计与实践
一套分布式IM即时通讯系统的技术选型和架构设计
陌陌技术分享:陌陌IM在后端KV缓存架构上的技术实践
微信团队分享:微信后端海量数据查询从1000ms降到100ms的技术实践
微信团队分享:来看看微信十年前的IM消息收发架构,你做到了吗
携程技术分享:亿级流量的办公IM及开放平台技术实践
百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现
转转平台IM系统架构设计与实践(一):整体架构设计
转转平台IM系统架构设计与实践(二):详细设计与实现
支持百万人超大群聊的Web端IM架构设计与实践
一年撸完百万行代码,企业微信的全新鸿蒙NEXT客户端架构演进之路
转转客服IM聊天系统背后的技术挑战和实践分享

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:移动IM聊天中发送视频,截取视频第一帧图片是怎样一个过程?下一篇:现代IM系统中聊天消息的同步和存储方案探讨

本帖已收录至以下技术专辑

推荐方案
评论 13
之前做的几个简单的demo我总以为是群聊简单的。原装最难的就是群聊
签名: 好久不来了 现在不忙了 好好学习
为什么我的头像在公司和家里的头像不是一个呢?这个头像文件是放到本地了么?
引用:liu1348789134 发表于 2017-11-20 13:42
为什么我的头像在公司和家里的头像不是一个呢?这个头像文件是放到本地了么?

浏览器的缓存
引用:奶瓶 发表于 2017-11-20 13:07
之前做的几个简单的demo我总以为是群聊简单的。原装最难的就是群聊

局域网写的demo可以用广播解决,所以初学会感觉群聊简单
引用:JackJiang 发表于 2017-11-20 13:47
浏览器的缓存

光棍节的纪念章能不能给我
引用:liu1348789134 发表于 2017-11-20 17:02
光棍节的纪念章能不能给我

OK 我送你!你属像勋章太多,我帮你删掉了
引用:JackJiang 发表于 2017-11-20 17:04
OK 我送你!你属像勋章太多,我帮你删掉了

thankyou
直接做才发现难
非常不错的文章,赞一个
厉害厉害
签名: 又来看看了
可以可以
很好的问题
群聊这种,怎么模拟测试呢?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部