IM电竞官网 分类
IM电竞官网 - 专业电竞投注平台注册登录送体验金百度公共IM系统的Andriod端 SDK组件架构设计与技术实现发布日期:2025-07-26 浏览次数:

  本文由百度技术团队分享,引用自百度Geek说,原题“百度Android IM SDK组件能力建设及应用”,本文进行了排版和内容优化。

  移动互联网时代,随着社交媒体、移动支付、线上购物等行业的快速发展,对即时通讯功能的需求不断增加。对于各APP而言,接入IM SDK(即时通讯软件开发工具包)能够大大降低开发成本、提高开发效率,快速构建自己的IM系统。

  本文主要介绍了百度公共IM系统的Andriod端IM SDK的建设背景、IM SDK主要结构和工作流程以及建设过程遇到的问题和解决方案。

  * 推荐阅读:百度技术团队分享的另一篇关于IM能力的文章《揭秘百度IM消息中台的全量用户消息推送技术改造实践》。

  近年来,随着互联网的普及和移动通信技术技术的快速发展,智能手机、平板电脑等移动设备的普及让越来越多的人享受到便捷的网络服务。这为即时通讯系统的发展提供了广泛的用户基础。

  传统的通讯工具如电话、短信等在满足用户需求方面存在一定的局限性,无法实现高效、便捷地沟通。即时通讯系统应运而生,以其强大的功能和便捷的体验满足了用户的便捷、高效通讯的需求。

  即时通讯系统(Instant Messaging,简称IM系统)是一种允许用户通过互联网实时交换信息的通信技术。核心功能包括消息的发送与接收、用户状态的管理、消息、会话的存储与检索等。为了更好地满足用户更多场景诉求,IM系统还提供了如群组聊天、文件传输、语音和视频通话等功能。

  PS:更多知识可以深入阅读《零基础IM开发入门(一):什么是IM系统?》、《知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)》。

  即时通讯系统的发展经历了从早期的在线聊天室、ICQ、MSN等个人即时通讯软件,到如今功能丰富的聊天社交软件(如QQ、微信)、企业级即时通讯系统(如钉钉、企业微信、飞书、如流)、应用内必备的IM能力(如百度、微博、小红书、抖音等APP中消息模块)等应用场景。

  IM系统因其实时性、便捷性和功能多样性,已经成为现代社会沟通不可或缺的工具,并且随着技术的发展,其应用场景还在不断扩展。

  PS:移动互联网时代的IM产品进化史可详读《盘点移动互联网时代的社交产品进化史(上篇):谁主沉浮》、《盘点移动互联网时代的社交产品进化史(下篇):大浪淘沙》。

  在百度公司内部,存在如百度APP、文心一言APP、APP、好看视频APP等各类APP,各业务各自搭建一套完整的IM系统存在开发、维护成本高,系统重复等问题。

  因此,搭建一套公共的能够满足各产品线诉求的完整IM系统势在必行。各业务只需独立接入公共IM系统即可实现业务自己的IM相关功能,大大降低了开发、维护成本和IM系统使用门槛,提高了业务IM功能开发、迭代效率。

  为了满足各业务/产品线各类诉求,需要将IM系统能力进行拆分、封装,提供不同能力粒度的IM组件。

  百度公共IM系统由客户端IM 套件(IM SDK、长连接SDK、IM插件、群聊组件)和服务端IM服务组成。

  基础服务层主要由公共IM系统中客户端IM套件、服务端IM服务,以及业务自己服务端组成。

  业务客户端通过接入IM SDK、长连接SDK实现业务客户端内IM相关能力,业务服务端通过接入公共IM系统中的服务端对外接口层,实现业务服务端消息发送和接收。通过业务客户端和服务单接入IM客户端套件和服务端,实现从业务端到业务服务端的双向触达。

  1)业务服务端:业务自己的服务端主要负责业务相关的业务逻辑处理,通过调用IM 服务端提供的公共接口进行消息发送,接收IM 服务端推送的消息,进行业务自有逻辑处理,根据业务自身情况决定是否自己持有数据。

  2)IM 服务端:提供实时、安全、稳定的登录服务、消息收发,消息会话同步、通知,消息、会话管理,用户信息管理、设置管理等服务。提供各服务对端接口,暴露对业务公共接口,方便业务快速接入。

  3)长连接SDK主要职责:长连接SDK主要通过约定数据协议、数据加解密、访问控制、数据压缩、创建、维护连接,处理异常等机制保证数据实时、安全、高效传输。

  4)IM SDK主要职责:IM SDK主要负责IM相关端业务逻辑处理,包括登录服务、消息、会话管理、未读数管理、用户、设置管理等能力。用户使用手机进行消息发送,使用IM 服务端对端接口协议,通过长连接SDK数据通道将消息发送到IM 服务端;通过长连接通道接收IM 服务端推送消息,经过业务逻辑处理后,触达到用户。

  5)IM插件主要职责:通过长连接SDK构建消息通道,使用IM SDK提供的IM逻辑服务层,增加聊天页、设置页等相关UI能力,打包构建出能够直接集成使用的聊天组件。

  6)群聊组件主要职责:通过长连接SDK构建消息通道,使用IM SDK提供的IM逻辑服务层,将群聊相关UI页面组合打包,输出包含完整群聊能力可直接集成的群聊组件。

  Android IM SDK整体由公共接口层、业务层和数据层组成,其中:

  1)接口层:根据业务需要,对外统一提供消息、会话、设置项等IM电竞,IM电竞官网,IM电竞注册,电竞投注平台,电竞博彩,英雄联盟竞猜相关操作接口以及未读数、成员等相关查询接口;

  2)业务层:在原始数据基础上增加业务相关逻辑,通过接口层返回给SDK使用方。

  3)数据层:数据层主要包含业务产生的原始数据的存储以及对原始数据的最原始操作。

  登录管理:负责在IM SDK初始化后长连接建连、重连,百度账号体系登录、退登、重登等情况下,IM 系统的登录、退登,登录信息、事件管理以及异常处理机制等;

  同步管理:负责在IM登录后同步单聊、群聊会话,消息、通知消息等账号内相关数据;

  通知管理:负责用户处于在线/离线状态时系统通知处理,包括但不限于通知监听、解析、指令调度分发等操作;

  消息管理:基于原始消息数据,提供消息发送、删除、更新、撤回、查询等操作;

  会话管理:负责基础会话数据管理以及会话创建、更新、删除、查询以及会话监听管理、变更分发等机制;

  群管理:负责管理群消息、群操作(如拉人、 踢人、退群、解散、禁言、增加管理员等操作);

  完整的IM工作环境需要有正常的网络,百度账号登录且状态正常,长连接稳定可用等,如果其中一个必要依赖异常时,IM系统便处于异常状态,无法继续完整使用IM SDK能力,出现SDK接口调用结果不符合预期的情况。比如网络断开或不可用时,长连接处于断连状态,对IM SDK如何感知?网络再次可用时,IM 服务如何恢复?IM服务不可用时,无法接收到新消息,IM服务恢复后,如何系统性地恢复?

  通过以上流程,可以很好地避免因为网络、长连接状态、账号状态变更时,IM服务能够快速重试,重置登录配置,重新登录IM,快速恢复用户数据,保持状态异常前后,消息及时触达。

  IM SDK在账号登录后,会登录IM系统,由于账号登录状态时效较长,绝大部分情况下账号均处于登录状态,每次启动APP时都会请求IM登录,IM登录后再同步用户会话和消息。百度APP拥有上亿用户,在用户集中使用APP的时间区间内,qps量级非常大,在服务端资源有限的情况下,大qps量级对IM服务端是一个不小的挑战。为了保持服务的稳定性,在资源有限的情况下,需要在业务逻辑上对请求做优化,降低服务qps,保持服务稳定可用。

  服务端对会话同步请求增加versionCode机制:每次客户端请求获取会话后,服务端返回一个versionCode(如果后续有新会话,才会更新versionCode),客户端下次登录再请求拉会话时如果传参的versionCode和服务端最新的versionCode一致,表示没有新会话,不需要查库等操作,直接返回空结果。

  为了降低服务端qps,在拉取会话时增加了versionCode机制,如果第一次拉取会话后没有新会话产生,后续拉会话时服务端根据versionCode判断服务端和客户端传参versionCode一致,表示端上会话列表和服务端一致,直接返回结果,表示没有新会话返回。如果在拉取完会话后,每条会话消息还未拉去完毕,此时断网或长连接中断,导致部分会话的消息没有拉取或没有拉取完毕,状态恢复再次重试拉取时由于已经获取到了最新的versionCode,再次从server拉取会话时无法拉取到会话,导致部分会话消息丢失。

  如果拉取某条会话的消息时,拉取请求服务异常,如果抛弃当前任务执行之后的任务,依然请求异常,导致队列中后续部分或剩余所有任务请求失败,消息拉取失败,导致无法拉取到部分会话消息,导致消息丢失。

  9.2挑战一:如何实现同一账号在线设备操作后,其他离线设备在线时用户数据一致性

  如果同一用户有多台手机,用户部分设备处于离线状态(设备断网或未打开APP),如果用户使用在线状态的手机执行了已读会话、删除会话、删除消息等操作,操作完毕后,再打开离线的设备,使其保持在线状态,此时刚保持在线状态的设备会话、消息、未读数状态仍未改变,出现两台设备消息/会话等状态不一致问题。

  需要把用户操作数据化,将用户操作构造为一条“指令”消息保存到服务端,等设备再次在线后,拉取到离线期间未接收到的消息后,拉取设备离线期间的操作指令消息,解析指令消息后,执行对应的操作。

  问题概述:IM系统中,数据一致性是指在多设备环境中,用户如果有多台设备或终端,各个设备登录同一账号,各个设备下显示的用户消息数量、消息未读状态、会话未读数、会话最近一条消息等要保持一致。

  对于同一账号登录多个设备的情况,设备均在线时,如果其中一台设备发送一条消息(或者进行已读、删除消息、删除会话、修改会话置顶、免打扰状态等操作),服务端会将新发送的消息通知推送到登录同一账号的其他设备上,其他设备接收到新消息通知后,再去拉取当前账号在其他设备发送的消息,更新会话,从而达到登录同一账号的多台设备数据同步,保持数据一致性。

  每个操作对应于一条通知消息,登录后同步当前设备离线期间产生的通知消息后,根据通知消息里携带的操作信息,再次执行对应的操作,实现多端同步效果。

  IM系统的消息“可靠性”,通常就是指聊天消息可靠投递。即对于消息发送方发出消息,要保证消息接收方及时、顺序接收到,并在UI中正常展示(不丢失、不重复)。(PS:相关文章可阅读《零基础IM开发入门(三):什么是IM系统的可靠性?》)

  在现实的使用场景中,从发送方点击「发送」按钮到接收方接收到消息,发送接收消息的整条链路中包含:

  IM SDK发送上行请求,长连接因为网络或其他原因导致长连接服务不可用、服务端服务异常时,消息发送失败,需要对发送失败的消息做标记,UI上提供视觉展示,增加重新发送机制,在交互上避免用户发消息失败时出现消息已发送对方收不到的错误预期,提高服务恢复时功能可用性。

  对于服务端推送到客户端的消息,服务端需要将消息存储,如果用户处于在线状态,则推送新消息通知给接收用户;

  如果服务端推送下行通知消息时,接收方长连接服务处于不可用/不稳定的情况,端需要增加长连接连接状态监测,重连拉取机制;监测到长连接重新连接后,主动重新拉取服务不可用时刻之后的消息,保障用户能够及时看到离线期间漏掉的消息。

  根据各类APP对于IM系统不同构建方案诉求,百度公共IM系统提供了包含IM各类能力粒度、高内聚、可扩展的长连接 SDK、IM SDK、IM聊天插件、群聊组件;提供了中台NA容器、HN容器、公共Web容器下IM聊天页接入方案;依托IM 服务端,提供了一套实时、可靠、稳定的IM服务。满足了各业务方快速、高效构建各自产品线IM能力的愿望,大大提高了开发效率、降低了开发成本。