基于webSocket的IM架构设计

微信架构已经非常透明,稍做抓包便可窥探整个传输机制,怎么实现已经没没什么好说了,手头IM(即时通信)为基础的衍生项目也做了3年了,IM设计架构连同服务器方案也变了3版,这里想说的是当前版本的架构设计。


先聊聊目前的整体架构设计,现项目是基于IM推送为主的OA类产品,包含会议、日程、任务、申请(请假/报销)等等OA模块,一切皆通过即时消息分发,同时包含通讯录,可以进行文字、语音、图片、附件、小视频等聊天,套路基本和微信、QQ、钉钉这类的差不多,面向企业化更多一点。前端采用了web和手机端同步办公设计,后端采用了IM服务器和接口服务器架构,IM服务器专门负责消息的分发和推送,接口服务器负责所有业务的处理。

前后端整体架构拓扑


移动端的架构设计

发送大概流程:

用户创建消息,图片/语音/附件之类的先写入沙盒——>写入本地数据库并标记待上传——>上传到HTTP服务器并得到服务器寄存文件的地址(图片还有缩略图尺寸)等相关参数——>更新数据库——>生成协议报文——>写入本地数据库后——>webSocket通道发送——>收到回执后——>更新数据库——>更新UI。

接收大概流程:

webSocket收到消息回调——>解包解码——>写入数据库——>更新UI——>下载相关资源

移动端socket业务层和传输层

以上牵扯到太多的分线程操作,画起来相当考验耐心,不比敲代码复杂。但是核心就是3个队列:数据库操作队列、webSocket传输队列、http上传下载队列。

三个队列全部采用单线程也就是FIFO

HTTP队列:负责发送附件、图片、语音等,并发数为1,FIFO模式(实际上服务器网络带宽是制约上传速度的第一瓶颈)。

WS队列:负责发送webSocket消息,并发数为1,且收到回执之前堵塞队列里待发送任务,保证语序的正确性,不会出现12345实际收到未34512这类语义逆反情况(语义逆反是最不能接受的)。

队列之间语序:HTTP队列里的内容上传结束后加入WS队列时,按照用户生成时间来排优先级进入。具体参考下述场景。

重发:以上两个队列都有各自重发机制,任务超时或者失败会重发处理,除非超出重发边界(微信似乎是15分钟超时,我们可以短一些)会置为失败不再系统自动重发,确保先处理的任务先出去。

堵塞:HTTP和WS两个队列不互相堵塞,也就是图片发送不会堵塞消息发送。

————实际场景(因为图片、附件、语音都是同样的方式,所以只取图片来举例)————

用户:用户发送了三张图片ABC,然后发送了10条文本,再发DEF三张图片。

代码:ABC分别纳入HTTP队列单个按顺序处理——>10条文本纳入WS队列进行按序发送——>A图片收到HTTP回执并且已经处理好相关事务进入WS队列,假设此时WS正在发送第6条文本等待回执中,那么此时A图片的WS消息因为是用户最先创建,那么在WS消息队列中优先级最高,插队到7之前,只要6一收到回执就处理图片A,如此类推。(微信语序就是如此)

接收方:文本消息接受语序会和发送方保持一致性,不管中间是否穿插图片类消息,也就是发送方发1-100接收方一定是收到1-100(服务器消息丢失等因素不在此讨论),图片类的接收语序也会和发送方保持一致性,不管中间是否穿插文本消息;但是图片类和文本类的绝对时间收发双方不会绝对一致,如上面用户发送的场景,实际接收方收到的顺序是1-6的文本,然后图片A,然后7-9文本,图片B,文本10,图片CDEF;具体依图片类上传网络速度和用户发送各类消息的间隔等(微信也是如此),因为图片上传不能堵塞消息发送,不然会被吐槽卡死。

————好处————

产品层面:好处就是文本语序的正确性,不会产生因为没发出去导致“丢消息”、“跳消息”的情况,且用户的体验也更好,不会出现类似群聊里面某个用户发了一大堆图文消息后,起初的几条因为发送失败并且已经不在当前视窗中(列表滚动上去了)而没有发现自己发送失败的尴尬,也不会出现一个领导说开会了,然后说不开了,用户收到的是不开了,开会了这样的语序导致的类似灾难性后果。

在开发层面:可以大大降低维护成本和Bug率,因为所有的事件处理变得非常简单明了,健壮性和可维护性都提高不少。


总结:

即时通信类的项目开发到后面,侧重的就不是单机的处理速度,快个几毫秒不是所要追求的目的;重心慢慢偏向于使用可靠性,架构简单和健壮性。对于开发来讲,越简单的设计和架构,维护越容易,解耦也越容易,业务层和传输层逻辑一定要解耦,一定要避免高并发处理,采用队列FIFO设计极大简化了逻辑复杂度,降低了模块耦合度。

对于开发,开发者应尽量避免追求性能第一,多线程是毒品,不要滥用,能一条分线程做得好的事情,不要去开多个线程并发,业务架构一复杂,开发和维护成本指数级上升,而且项目最后期10%的Bug变得极为难排。能用队列解决的事情,不要去做自己处理线程。


PS:业务层很多指令在此就不说了,例如web和手机端要双向同步消息和指令,支持转发撤销之类的不在此赘述了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,638评论 0 15
  • 一 典型的即时通讯架构可能是这样的 无论是IM消息通信系统还是客户消息系统,其本质都是一套消息发送与投递系统,或者...
    isgiker阅读 5,059评论 3 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能...
    Sophie12138阅读 721评论 0 7
  • 老师说,我们名族骨子里是透着自卑的。 明清闭关锁国,不是偶然,而是农耕文明下的一种必然,中国农业文明,一旦形成,惰...
    去他娘的昵称阅读 183评论 0 0