实时性
1.线程池多线程,把消息同步给其他端和对方用户,其中数据持久化往往是最浪费时间的操作,可以使用mq异步存储,因为其他业务不需要拿着整条数据,只需要这条数据的id进行操作。
2。消息校验前置,放在tcp层(netty服务中)
可靠性

tcp协议只能保证数据在传输过程中不丢失,但不能保证到某一端不会丢失,比如传输过程中接收方断网,数据就无法发送到接收方 。
可靠性可以通过消息重发来保证消息一定送到了对方手中。可以通过双重ack确认机制来实现:

A向im服务端发送数据,服务端收到就返回一个ack,A收到这个ack就停止重发,否则就再次尝试重发。当然重发需要设计上限次数的。
然后服务端接到A的数据,再发送给B,B接到之后告诉服务端,返回一个接受到的ack。服务端把收到的再传回给A,此时A确定了此次传输是成功的。中间任何环节出问题,A就执行重发就ok了。
如果B不在线,服务端是可以感知到的,服务端可以代替B向A回复停止重发指令。
有序性
因为我们使用多线程保证了消息的实时性,那么就会导致消息有乱序的风险。
解决方案:
使用redis的incr命令实现原子性的递增序列号,但是过度依赖redis可能会因为redis的崩溃而造成系统失效
幂等性
再im服务端存储每次发过来的消息id(设置过期时间),重复发送的消息id将不再进行持久化但仍会给另一个客户端发送消息。这样就会导致另一个

2579

被折叠的 条评论
为什么被折叠?



