客户端确保消息同步的准确性主要依赖于以下几个关键技术和策略:
全局唯一的消息ID生成策略:为了保证消息可以通过ID进行识别和排重,IM系统采用全局唯一的消息ID生成策略。这种策略可以确保每条消息都有一个唯一的标识符,从而在消息的发送和接收过程中避免重复 。
客户端与服务端的长连接和协议层保障:客户端与服务端之间使用长连接,基于自研的通信协议(如RMTP)传输数据。协议层通过QoS(服务质量)和ACK(确认应答)等机制,保证数据传输的可靠性 。
上行和下行消息处理:消息的交互流程被拆分为上行(消息发送者到服务端)和下行(服务端到消息接收者)。上行过程中,消息按照用户ID和时间戳进行排序和存储,下行过程中,服务端根据目标用户的最新时间戳和消息ID来决定是否更新时间戳,确保消息的有序性 。
多端同步机制:对于多端在线的情况,IM系统需要记录消息的顺序和每个端的同步点,以实现消息的最终一致性。这通常涉及到为每个用户创建一个消息收件箱(如message_inbox),为每条消息创建一个自增的同步ID(sync_id),以及记录用户在每个客户端上的同步ID 。
数据结构和存储产品选型:在多端同步中,需要提炼统一的消息数据结构,并选择合适的存储产品来支持消息的同步。例如,使用云数据库Tair(兼容Redis)的Hash结构来存储每个用户在客户端上的同步ID,以及使用其计数器功能和Sorted Sets结构来管理消息顺序 。
拉取与推送机制:多端同步一般采用拉取和推送相结合的机制。设备上线时主动拉取未读消息,而服务器则通过推送机制将新消息即时发送到各个设备上 。
ACK确认机制:在关键业务中,采用ACK确认机制,配合状态机,服务感知当前业务传输状态,保障业务按照预期执行 。
通过这些技术和策略的综合应用,客户端可以确保消息同步的准确性,实现消息的不丢失、不重复、不乱序。