打造安全可靠的实时通信服务:OpenIM的实践与方法指南
即时通讯作为移动应用的常用组件,开发起来却并不简单,除了需要研究通讯协议,保证安全性,还要应对复杂的移动网络情况,以提供高可用性的服务。OpenIM是阿里巴巴推出的,集成于阿里百川项目中的移动端 IM 开放服务。阿里百川是阿里巴巴集团无线开放平台,为移动开发者(涵盖移动创业者)提供快速搭建 APP、加速 APP 商业化、提升用户体验的解决方案。
此文主要记录了 InfoQ 采访该服务研发负责人敖闰,针对如何打造一个高可用的安全可靠的即时通讯服务进行了讨论。
受访者:敖闰(符小宝)
旺旺团队技术总监。一直从事移动互联网相关产品研发工作。加入阿里前,主导开发 Qualcomm BREW 平台上 WWW Embedded Browser。2009 年加入阿里后负责云 OS Framework 及 Apps 工作,2012 年开始负责阿里旺旺团队的研发工作。
Q:请简单介绍一下OpenIM目前的团队配置情况。
OpenIM 来自于旺旺事业部,旺旺事业部历史比较悠久,从 2003 年淘宝成立初期,旺旺团队同时成立,旺旺产品和淘宝一起成长,迅速成长为全球最大的客服沟通平台(日均消息量10亿级,DAU 亿级)。目前团队上百人,包括产品运营团队,技术团队,测试团队等,其中技术团队含 IM 服务端技术团队,及全平台的客户端技术团队(Android, iOS, Windows, Mac, H5) 。已授权 IM 相关专利数近百项。
Q:请介绍一下 OpenIM,以及淘宝为何将这项能力开放出来?在业务上有什么特色?
OpenIM 是阿里巴巴面向应用开发者开放的免费即时通信服务,由阿里旺旺团队提供。作为即时通讯基础组件,已经支持了手机淘宝,阿里旺旺,旺信,天猫,聚划算,去啊等阿里系内部应用。现在,开发者基于 OpenIM,可量身定制“类微信”“类旺信”“类千牛”的应用。
阿里希望构建云(阿里提供的基础服务)+端(各类 APP)的全新移动时代商业生态,来满足消费者个性化、场景化的无线生活和无处不在的需求。移动互联网时代,为了增强人与人之间的连接,各类 App 都需要基础的沟通功能。开发者开发一套高可用性的 IM 系统,成本非常高。我们将拥有 12 年技术沉淀、历经多次双十一考验的即时通讯能力及客服平台能力开放出来,帮助开发者轻松实现沟通功能,降低 App 开发成本。
OpenIM 除了基础的 IM 功能之外,同时开放的还有全球最大的客服平台功能。基于该客服平台的旺旺/千牛,目前在电商行业已服务上千万卖家。
Q:您刚才提到开发者开发一套高可用性的 IM 系统成本非常高,那么大规模的即时通讯在技术上有什么难点?
我们梳理了一下,大概有下面四个技术难点:
如何确保系统的高可用性?因为 IM 服务一旦中断,对用户体验的伤害非常大,所以,一定要保证服务的高可用性。
如何在移动网络环境下优化电量,流量,及长连接的健壮性?现在移动网络有 2G、3G、4G 各种制式,并且随时可能切换和中断,移动网络优化可以说是面向移动服务的共同问题。
如何确保 IM 系统的整体安全?因为用户的消息是个人隐私,因此要从多个层面来保证 IM 系统的安全性。
如何降低开发者集成门槛?这个是针对第三方 IM 服务来说的,如果集成成本太高,开发者用起来不方便,在实际使用中也会出现各种问题。
Q:如何确保 IM 的高可用性?OpenIM 的服务端架构是怎样的?
经过多年双11的考验,我们IM服务的可用性持续保持99.99%以上。旺旺团队逐步形成了系统高可用性解决方案,具体策略包括:
水平伸缩的系统架构:全系统无单点设计,各个业务系统环节均可水平伸缩,同时负载均衡系统,会实时的进行流量分配,让整个系统运行在合理的水位。
异地多活去中心化部署:去中心化的异地多机房部署,多个机房同时提供服务,任何一个点的故障,其他机房能够即时承接。
自动化故障隔离容灾系统:对于服务器的故障,能够实时的检测并且自动的隔离,快速的切换流量到正常的服务器。
完备的监控和预警体系:基于阿里巴巴运维体系的完备的监控和预警,让我们对整个系统的运行状态了如指掌。
整个系统分为:
接入层(客户端):负责客户端接入,
接入层(服务端):负责 App Server 和 OpenIM 服务器的对接。
协议路由:消息路由和业务逻辑层,负责消息路由和各种业务逻辑处理;
数据层:负责用户、业务数据的缓存,持久化等。
Q:OpenIM 针对移动网络的特点做了哪些优化?
我们做的优化有:
极简协议:OpenIM 采用完全私有的二进制协议:确保数据加密安全的同时,流量消耗极少。同时心跳包协议对 IM 的电量和流量影响很大,OpenIM 在心跳包协议上进行了极简设计:仅 1 Byte 。
智能心跳:OpenIM 独特的保活机制,自动适应不同的网络环境,智能调整心跳频率,将参数调整到最优状态。
智能唤醒: 众所周知,Android 手机电量消耗一直为大家所诟病。 后台各种应用不断唤醒手机,致使手机待机时间大为缩短。OpenIM 能以最低限度唤醒手机进行必要的保活,保证连接的健康及消息的及时到达: OpenIM 与系统以及其他应用进行交互,如果有其他应用唤醒了手机,OpenIM 将避免冗余唤醒,节约设备的电量消耗。
多路复用,共享连接:OpenIM 的 SDK 广泛使用在阿里的各移动应用中,如手机淘宝、天猫、旺信、千牛、去啊等。通常来说,多个 IM App 会有多条物理 TCP 长连接,OpenIM 支持多应用共享复用一条 TCP 长连接,保活的流量将从 N 倍变为 1 倍; 唤醒手机次数也由 N 个应用唤醒变为1个应用唤醒。由于这些阿里应用覆盖用户群较大,OpenIM 会自动共享阿里应用已经存在的物理连接,极大减少电量和流量开销。
多路复用, 共同保活:同时,Android 系统资源紧张时会在后台清理进程,当某个 OpenIM 所在应用被清理后,通常 OpenIM 消息也就无法实时触达。但由于“多路复用”机制,只要当前任一应用(包括阿里应用)还存活,OpenIM 均能顺利工作,有效提升了长连接的健壮性。
Q:OpenIM在安全上做了哪些事情?
基于旺旺海量消息(每日十亿级)数据样本及旺旺安全的多年技术沉淀,OpenIM 为开发者提供了与支付宝,淘宝,天猫同等级别的安全服务,从账号安全,传输安全,存储安全,内容安全等各个维度提供了完整的安全方案。
帐号安全。 OpenIM 各自域的用户帐号经过 MD5 加密后进行传输和存储,保证开发者用户数据的私密性及安全。OpenIM 客服帐号,享受阿里系账号的所有安全功能:数字证书,一键校验,手机验证等。
数据传输安全。 包括:完全私有的二进制通讯协议;动态秘钥,全链路加密传输。
本地存储安全。 就是将本地数据库加密。
内容安全。
- 恶意内容检测:支持可配置的关键字系统,支持风险提醒和过滤;支持恶意链接(钓鱼链接等)和二维码图片的风险识别:基于阿里系内最大的恶意链接库(WenKing)。
- 反垃圾安全。基于每天海量消息(十亿级)和用户(亿级)综合行为的基础数据,构建的大型反垃圾系统,实现恶意行为的实时监控。基于文本及图片模型的垃圾识别算法,支持恶意内容的实时监控。恶意内容样本的系统自学习,提升系统的召回率。
Q:OpenIM如何降低开发者的集成门槛?
针对客户端集成,OpenIM 对外提供两种集成方式 (OpenIMKit , OpenIMCore), 其中OpenIMKit 提供了高度集成的 IM 组件,用户只需调用三个接口(初始化,登录,创建聊天) 即可完成简单地集成。同时针对用户的定制化需求,OpenIMKit 提供了丰富的定制化接口,用户可以按需定制整体界面及风格。
Q:请介绍一下 OpenIM 未来的计划。
未来我们一方面会丰富即时通讯的能力,不仅是文字、语音、图片、自定义消息,还包括类似VoIP、阅后即焚、收发红包等能力。另一方面,我们会更深入了解垂直类行业 App 的沟通诉求,结合客服能力特色,为不同行业的 App 提供基础定制即时通讯的解决方案,比如社交互动、企业协同、生活服务等。
推荐阅读
-
用Vue3.0打造Todo List:探索query参数与params传递方法的实践指南
-
打造安全可靠的实时通信服务:OpenIM的实践与方法指南
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
如何轻松使用JMeter进行HTTP接口测试 - 一步步教你设置线程组、 cookie、默认值与Sampler,加上响应断言和监听器,打造基础测试案例。针对复杂情况,将子系统和流程测试分类组织,确保数据一致性。同时,别忘了感谢阅读,给新手提供实战学习资源与全套测试指南,助你轻松踏上自动化测试之路! - 在"测试计划"点击右键,添加"线程组"并设定初始"线程数"和"循环次数" - 配置"HTTP Cookie管理器"与"Http请求默认值",输入目标系统信息,如域名、端口、协议等,让所有相关Sampler共享这些默认设置 - 在线程组内增加"HTTP Request"的Sampler,并填入接口详情,比如路径、请求方法及参数 - 添加"响应断言"检查接口返回结果,通过正则表达式验证预期结果 - 安装监听器,实时查看测试执行状况 - 如需处理流程性接口,请依次添加多个相关Sampler,关联前后请求间的上下文数据 特别提示:为了帮助大家避免学习中的曲折,我们准备了详尽的视频和文档资料库,无论你是软件测试的新手还是老司机,都能从中找到所需的全方位支持。只需点击下方链接加入我们的学习交流社群,就能立刻获取这份珍贵的学习宝藏!再次感谢您的耐心阅读,愿它成为您前行路上的一大助力!
-
实用指南:打造与现场运用 Crash 实时统计数据的方法