Open linhtV opened 6 years ago
传统方式im系统会在接收到接收方成功处理消息的应答后,向消息发送方发送确认,消息的可靠性主要由消息发送方来保证,这样会增加第三方用户的开发成本。 出于chat的定位,以及基于系统中connector与chat之间通过长轮询方式首发消息,只要user/agent发送的消息到达chat,接受者agent/user一定能通过轮询的方式将消息取走,因此解决思路主要是保证connector与chat两两之间的消息可靠投递。以防止传统解决方案中,由于网络或接收方的异常,不能轮询走发送方已经成功投递到chat的消息,而对已经成功投递到chat的消息进行重复重发。简而言之就是消息的可靠性由chat 进行保证。
发送方向chat发送消息,chat成功处理消息后同步返回确认消息。 发送方提供一个消息发送序列,可以采用本地时间戳,chat以此对消息进行排序。如a-local-timestamp chat根据消息接收方的唯一标识在redis上维护三个队列,分别是消息实体队列,待确认消息队列,待接收消息队列。
chat提供轮询消息接口:getMsgs(receiverId:String,preAcks:list) 其中receiverid为消息接收者唯一标识,preAcks是接收方对上一轮轮询收到消息的确认。
user connector 与第三方平台(wechat)之间的调用流程,细节。
基于长轮询消息可靠性分析
系统逻辑架构
可靠性解决方案
传统方式im系统会在接收到接收方成功处理消息的应答后,向消息发送方发送确认,消息的可靠性主要由消息发送方来保证,这样会增加第三方用户的开发成本。 出于chat的定位,以及基于系统中connector与chat之间通过长轮询方式首发消息,只要user/agent发送的消息到达chat,接受者agent/user一定能通过轮询的方式将消息取走,因此解决思路主要是保证connector与chat两两之间的消息可靠投递。以防止传统解决方案中,由于网络或接收方的异常,不能轮询走发送方已经成功投递到chat的消息,而对已经成功投递到chat的消息进行重复重发。简而言之就是消息的可靠性由chat 进行保证。
chat消息缓存设计
发送方向chat发送消息,chat成功处理消息后同步返回确认消息。 发送方提供一个消息发送序列,可以采用本地时间戳,chat以此对消息进行排序。如a-local-timestamp chat根据消息接收方的唯一标识在redis上维护三个队列,分别是消息实体队列,待确认消息队列,待接收消息队列。
轮询接口定义
chat提供轮询消息接口:getMsgs(receiverId:String,preAcks:list) 其中receiverid为消息接收者唯一标识,preAcks是接收方对上一轮轮询收到消息的确认。
消息队列说明
消息接收流程: