本文在编写时参考了博客作者“鹿呦呦”和在线课程“即时消息技术剖析与实战”的相关资料,一并表示感谢。
IM系统看似简单(没错,很多土老板认为开发个qq和微信也就是几万块钱的事... ),实责是众多技术的应用合体,包括网络编程IM电竞、移动开发、后端开发、高并发、高可用IM电竞、高安全等技术范畴,再加上多端使用不同的编程语言IM电竞,想要凑齐一个典型的IM产品技术栈那也不是个容易事。
而对于IM开发入门者来说,想要在众多的IM技术术语和概念中找到学习的方向和需要的资料,那也是件很让人抓狂的事。如果看到不该看的技术深水区文章,直接从入门到放弃——被活活吓退,那也是相当悲剧的。
本系列文章将尽量从理论概念入手,通俗易懂的梳理IM中的基础技术概念和热门技术点,希望能帮你理清看似一团乱麻的IM知识体系,助你找到清晰的IM技术学习方向,来日工资翻倍、迎娶白富美也未必不可能!
友情提示:本系列文章侧重于理论概念的讲述,篇幅有限,点到即止,如需系统、深入、具体地学习IM技术的方方面面,请从此文入手:《新手入门一篇就够:从零开发移动端IM》(史诗级文章,适合从入门到放弃)。
本文将带你快速了解一个主流IM系统的应用场景、典型架构、技术特点和功能组成,帮你快速建立对IM系统的主观认知。
如果你不想从技术的角度理解IM原理,可以尝试阅读此文:《知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)》。
本文已收入即时通讯网的入门纲领性文章《新手入门一篇就够:从零开发移动端IM》。
IM其实并不局限于聊天、社交这类“典型”应用中,实际上它已经广泛运用于我们身边形形的软件中。
聊天、直播、在线客服、物联网等所有需要实时互动、高实时性的场景等等,都需要应用到 IM 技术。
(本图引用自《即时消息技术剖析与实战》学习笔记1——IM系统的架构》一文)
对于IM系统,“实时”二字是精髓,也是这项技术存在关键意义所在。它保证的是消息的实时触达。举个例子:如果跟你的好友微信或qq聊天,我发的消息他不能即时收到,或者他发的信息你也不知道什么时候能收到,这基本上也就没法聊下去了(干吗不痛快打个电线)可靠性:
保证消息的不丢失和不重复,是IM系统的另一个关键技术特点。试想,当你在用qq或微信跟女朋友聊天,好不容易鼓起勇气向“她”表白,结果这消息要是丢包了,那肯定得卸载应用了,搞不好砸手机都有可能。当然,好话不说二遍,消息重复也同样恼人。
《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》《IM消息送达保证机制实现(二):保证离线消息的可靠投递》
以下文章对消息时序问题进行了深入探讨,有兴趣可以详读:《如何保证IM实时消息的“时序性”与“一致性”?》
《即时通讯安全篇(二):探讨组合加密算法在IM中的应用》《即时通讯安全篇(七):用JWT技术解决IM系统Socket长连接的身份认证痛点》
这个很好理解,使用IM系统的第一步,就是要解决“跟谁聊”的问题。从功能表象上来说,联系人列表也就是社交关系列表,无非就是个信息列表界面,有什么特殊的地方?
联系人列表看似简单,实际上它是一系列IM系统的社交关系确立动作的结果体现。要想建立联系人列表,你可能需要实现以下逻辑:
聊天界面看似很平常,实际它就是IM系统客户端的核心功能所在,所有主要的IM功能都是通过它展现。
它应该具备的能力有:1)各种聊天功能按钮:语音留言、图片、文字、表情、文件、实时电线)各种聊天消息显示:各种消息都有不同的UI显示元素和处理逻辑;
如上图所示,消息发送通道这个比较好懂,最浅显易懂的理解就是用tcp或udp,建立socket长连接,需要发消息的时候,wirte一下就过去了,好简单!
但,事情往往不是想象的这么简单:1)如何保证这条socket长连接时一直处于可用的状态?
2)当socket长连接断开时,对方发送消息该怎么实现?3)当socket恢复连接时,怎么恢复之前的聊天现场?
3)对方在线或不在线时:聊天消息都要存到服务端(用于实现多设备的消息漫游和同步)。具体要存储的内容和时机也就上面这几样。
3)多终端情况下,怎么保证未读数的一致性(我在这台设备上读没读,那台设备怎么知道的?)?是的,看起来就这么简简单单的3件事,但深入思考一下,还线、本文小结
IM系统的技术特点来说,就是实时性、可靠性、一致性、安全性,除了实时性对于多数应用来说并不关心,其它的指标也很好理解。
IM系统的功能组成上,联系人列表用于数据模型的建立、聊天界面承载了IM系统的终端展现、消息的收发通道用于实现“实时”这个特性im资讯、存储和未读数看似不是必须但用户体验上确必不可少。
《社交软件红包技术解密(一):全面解密QQ红包技术方案——架构、技术实现等》
IM电竞
《社交软件红包技术解密(九):谈谈手Q红包的功能逻辑、容灾、运维、架构等》
《社交软件红包技术解密(十):手Q客户端针对2020年春节红包的技术实践》
《从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结》
《IM开发基础知识补课(六):数据库用NoSQL还是SQL?读这篇就够了!》
《瓜子IM智能客服系统的数据架构设计(整理自现场演讲,有配套PPT)》
《从游击队到正规军(三):基于Go的马蜂窝旅游网分布式IM系统技术实践》
《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》
《IM开发基础知识补课:正确理解前置HTTP SSO单点登录接口的原理》
《开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀》
《如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源》
IM电竞
《自已开发IM有那么难吗?手把手教你自撸一个Andriod版简易IM (有源码)》
《IM开发基础知识补课(六):数据库用NoSQL还是SQL?读这篇就够了!》
《适合新手:手把手教你用Go快速搭建高性能、可扩展的IM系统(有源码)》
《IM消息ID技术专题(一):微信的海量IM聊天消息序列号生成实践(算法原理篇)》
《IM消息ID技术专题(二):微信的海量IM聊天消息序列号生成实践(容灾方案篇)》
《IM消息ID技术专题(三):解密融云IM产品的聊天消息ID生成策略》
《IM消息ID技术专题(五):开源分布式ID生成器UidGenerator的技术实现》