默认

[已回复] 用于MobileIMSDK开发即时通讯成功和失败回调异步并发的疑问

查看数: 46997 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-08-22 21:34

正文摘要:

客户端A给B发消息单聊,B不在线,数据被服务端成功在线发送出去为true时回调onTransBuffer_C2C_CallBack做消息存储,而B不在线不给应答又开始回调onTransBuffer_C2C_RealTimeSendFaild_CallBack,做离线处理,问题: ...

评论

JackJiang 发表于 6 年前
引用:天道有情战天下 发表于 2018-08-23 17:44
好的,感谢官方大佬

嗯嗯
天道有情战天下 发表于 6 年前
引用:JackJiang 发表于 2018-08-23 17:32
那没有办法,客户端异常掉线的情况下,服务端的判定是个有延迟时间的,没有办法立即知道的,这是常识。客 ...

好的,感谢官方大佬
JackJiang 发表于 6 年前
引用:天道有情战天下 发表于 2018-08-23 11:46
我的意思是当接收端瞬间离线,但是服务端判定还在线,就是还没来得及判定离线呢,这时就会出现我上述的问 ...

那没有办法,客户端异常掉线的情况下,服务端的判定是个有延迟时间的,没有办法立即知道的,这是常识。客户端跟服务端的连接状态是用心跳来保证的,这个延迟就是心跳的间隔。你可以体会一下,如果是你来实现这个判定策略,你该怎么写。
JackJiang 发表于 6 年前
MoibleIMSDK的逻辑是成功送出的消息才走onTransBuffer_C2C_CallBack,没有成功送出或对方已离线的情况下才走onTransBuffer_C2C_RealTimeSendFaild_CallBack(真如这个方名的命名含义一样),所以重复的可能性发生于:对方在线但本次网络发送没有成功。

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

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

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

返回顶部