请选择 进入手机版 | 继续访问电脑版

默认
发表评论 5
[已回复] 用于MobileIMSDK开发即时通讯成功和失败回调异步并发的疑问
客户端A给B发消息单聊,B不在线,数据被服务端成功在线发送出去为true时回调onTransBuffer_C2C_CallBack做消息存储,而B不在线不给应答又开始回调onTransBuffer_C2C_RealTimeSendFaild_CallBack,做离线处理,问题:会出现成功回调的消息还没有入库离线的先入库了,然后成功的同一条消息再把离线入库的消息覆盖掉,后面还有离线丢包的情况

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] 求教MobileIMSDK的netty版SDK中closeFuture.await()会阻塞问题下一篇:[已回复] 请教MobileIMSDK服务端的sendData方法返回false却走成功回调?

本帖已收录至以下技术专辑

推荐方案
评论 5
MoibleIMSDK的逻辑是成功送出的消息才走onTransBuffer_C2C_CallBack,没有成功送出或对方已离线的情况下才走onTransBuffer_C2C_RealTimeSendFaild_CallBack(真如这个方名的命名含义一样),所以重复的可能性发生于:对方在线但本次网络发送没有成功。

这种情况属于极端情况,并不是常态。

所以,最简单的解决办法就是判断消息指纹码,如果存在就不用重复插到数据库了。这样的处理逻辑你也不用担心性能问题,因为插库并不需要多即时,以后你可以用MQ做中件间,im这边只管扔到mq上,而mq那边你再写一个独立的消息者,让它再去慢慢取消息并存库。这样就不会影响Im的性能了(因为插库这种涉及io的操作,对于高性能高吞吐的im来说肯定会是性能瓶颈了)。

不知你是否理解了我的意思

签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-08-22 22:08
MoibleIMSDK的逻辑是成功送出的消息才走onTransBuffer_C2C_CallBack,没有成功送出或对方已离线的情况下才 ...

我的意思是当接收端瞬间离线,但是服务端判定还在线,就是还没来得及判定离线呢,这时就会出现我上述的问题既走成功又走失败,例如当10的时候突然离线,11到18既走成功又走失败,这样比如当11走完成功但是还没走离线时12走成功和11走离线同时的时候就会出现存储最后未读消息的冲突,就会丢消息,第二张图片是在线上跑demo测出来失败的时候还丢了8和15的包,都是在突然离线的情况下,第三张是重传了一次然后接收方离线,但是7离线丢了
QQ截图20180823155558.png

8和15丢了

8和15丢了

7丢了

7丢了
签名: 今天天气很好
引用:天道有情战天下 发表于 2018-08-23 11:46
我的意思是当接收端瞬间离线,但是服务端判定还在线,就是还没来得及判定离线呢,这时就会出现我上述的问 ...

那没有办法,客户端异常掉线的情况下,服务端的判定是个有延迟时间的,没有办法立即知道的,这是常识。客户端跟服务端的连接状态是用心跳来保证的,这个延迟就是心跳的间隔。你可以体会一下,如果是你来实现这个判定策略,你该怎么写。
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
引用:JackJiang 发表于 2018-08-23 17:32
那没有办法,客户端异常掉线的情况下,服务端的判定是个有延迟时间的,没有办法立即知道的,这是常识。客 ...

好的,感谢官方大佬
签名: 今天天气很好
引用:天道有情战天下 发表于 2018-08-23 17:44
好的,感谢官方大佬

嗯嗯
签名: 《知乎从单机到2000万QPS并发的Redis高性能缓存实践之路》http://www.52im.net/thread-1968-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部