教你微信IM即时消息系统的架构设计

本文详细阐述了IT中的接入服务,包括其功能如消息推送、协议编解码、session维护,以及业务处理、存储和IM特点。强调了实时性和可靠性的重要性,并讨论了为何拆分接入服务以提高系统稳定性。此外,文中还提及了Java开发者的学习资源和成为架构师的目标。
摘要由CSDN通过智能技术生成

接入服务的功能:

保持连接
消息推送

当服务端有消息需要推送给客户端时,也是将经过业务层处理的消息先递交给接入层,再由接入层通过网络发送到客户端。

协议的编解码

编解码实际主要是为了节省网络流量,系统会针对传输的内容进行紧凑的编码(比如Protobuf),为了让业务处理时不需要关心这些业务无关的编解码工作,一般由接入层来处理。

session维护

session的作用是标识“哪个用户在哪个TCP连接”,用于后续的消息推送能够知道,如何找到接收人对应的连接来发送。

接入服务还负责最终消息的推送执行,即通过网络连接把最终的消息从服务器传输送达到用户设备。

业务处理服务

消息业务逻辑处理,比如消息的存储、未读数变更、更新最近联系人等。

存储服务

账号信息、联系人关系链,以及消息本身,都需服务端存储持久化存储。还有一些用户消息相关的设置,比如:用户可以设置不接收某些人的消息,还有附件。

服务端可以只是维护一个用于暂存消息和信令的离线buffer,至于存多久和产品需求以及监管需求相关。

即时消息可以放到MQ中,或者缓存中,使用数据抽取工具周期性的将数据提交服务器,进行持久化。服务器存储历史数据和近实时的数据。其实就是通过 MQ来异步化解耦消息存储逻辑。

作用
  • 会话一方用户不在线,上线时进行消息推送

  • 内容审查,监管,电子证据,法律要求

  • 数据分析,舆情分析

外部接口服务

由于手机限制及资源优化的考虑,大部分App在进程关闭或长时间后台运行时,App和IM服务端的连接会被手机os断开。这样当有新的消息产生时,就没法通过IM服务再触达用户,因而会影响用户体验。

为让用户在App未打开或在后台运行时,也能接收到新消息,我们将消息给到第三方外部接口服务,来通过手机操作系统自身的公共连接服务来进行操作系统级的“消息推送”,通过这种方式下发的消息一般会在手机的“通知栏”对用户进行提醒和展示。常用的第三方系统推送服务:

  • 苹果手机自带的APNs(Apple Push Notification service)服务

  • 安卓手机内置的谷歌公司的GCM(Google Cloud Messaging)服务

但GCM服务在国内无法使用,为此很多国内手机厂商在各自手机系统中,也提供类似的公共系统推送服务,如小米、华为、OPPO、vivo等手机厂商都有相应的SDK。

接入服务和业务处理服务独立拆分原因:

  • 接入服务作为消息收发的出入口,必须高可用

如果连接服务总不稳定:连不上或频繁断连,大大影响聊天流畅。

业务处理服务由于随产品需求迭代,变更非常频繁,随时有新业务需上线重启。

若消息收发接入和业务逻辑处理都在一起,势必让接入模块随业务逻辑的变更上线而频繁起停,导致已通过网络接入的客户端连接经常性地断连、重置、重连。

这种连接层的不稳定性会导致消息下推不及时、消息发送流畅性差,甚至会导致消息发送失败,从而降低用户消息收发的体验。

所以将“只负责网络通道维持,不参与业务逻辑,不需要频繁变更的接入层”抽离出来,不管业务逻辑如何调整变化,都不需要接入层进行变更,这样能保证连接层的稳定性,从而整体上提升消息收发的用户体验。

  • 业务开发人员的角度看,接入服务和业务处理服务进行拆分有助于提升业务开发效率,降低业务开发门槛。

模块拆分后,接入服务负责处理一切网络通信相关的部分,比如网络的稳定性、通信协议的编解码等。这样负责业务开发的同事就可以更加专注于业务逻辑的处理,而不用关心让人头痛的网络问题,也不用关心“天书般的通信协议”了。

接入模块收到一个消息后,通过rpc或者mq来进行对接推送到业务模块。

  • 业务模块下发消息给用户时,怎么知道用户处于接入模块的那一个实例服务(接入模块肯定是有多个实例同时运行的)

推送时,可以在用户上线时维护一个全局uid到接入网关的映射来做定向推送,对于超大群或直播互动场景可不区分某一个用户落在哪个接入网关,而是让所有网关获取后来下推连到本机用户。

IM特点

===================================================================

实时性


即时消息被广泛应用于各种社交、互动领域的基本前置条件:

  • 如果通过微信聊天,对方半天才收到消息,基本上就是备胎不想再聊了

  • 直播时,如果主播的互动消息房间里的粉丝要等很长时间才能收到,也很难让粉丝们有积极参与的欲望

可靠性


  • 不丢消息

“丢消息”是互动中让人难以接受的Bug,某些场景下可能导致业务可用性差,甚至不可用的情况。比如直播间“全员禁言”的信令消息丢失,就可能导致直播室不可控的一些情况。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
a核心架构笔记**你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

[外链图片转存中…(img-A9FeAiMi-1712446923231)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值