IM

IM 消息如何保证可靠性

IM 消息如何保证可靠性

Posted by ZW on May 4, 2020

可靠性

IM的可靠性即保证IM的消息不丢失,一定送达。

tcp协议不就能保证消息不丢失吗?

这里的消息不丢失和tcp 协议的可靠性不是一个层面的东西。这里说的消息不丢失是指应用层的消息不丢失。tcp 协议只能保证消息在传输层不丢失。而从传输层到应用层还有一个过程,这里一旦出错,就可能会出现明明消息到达了,用户却看不到消息的情况。所以一个完善的im应用必须保证在应用层实现消息可靠

2个报文

2个报文

这里如果 消息①③ 丢失,则”你好” 无法送达。

4个报文

4个报文

相比 2个报文 增加了2个ack ,当消息① 没有被正常消费时,user1 则不会收到消息②(ack)。此时重传消息①。这样确保IM_server一定能收到消息①,同样的道理。消息④确保user2一定能收到消息③

6个报文

4个报文已经能保证消息不丢失了,为什么还要增加2个呢? 可能user1发给user2之后user1还要知道user2什么时候收到这个时候就需要增加两个报文来实现 6个报文

相比 4个报文 又增加了消息⑤,如果user2没有收到消息⑤则重推消息④,确保让im_server知道user2已经收到消息 增加消息⑥,通知user1 ,user2已经收到消息

总结

设计思路和tcp 协议类似,超时、重传、确认。原则上为了满足业务需求不局限于只使用4个或者6个报文。