背景
我们都知道openfire丢包是比较严重的,要做即时通讯,肯定无法容忍这样的事情。为何会丢包?本人站在巨人的肩膀上,总结有两种情况:
1)客户端A发送消息到客户端B,消息经过服务器,由服务器转发给客户端B,如果客户端B不在线了,此消息则无法发送到客户端B。openfire不是有离线消息机制吗?
对,但是,用户由在线状态到离线状态大致有两种情况:
第一种情况没有问题:由用户主动发起一个下线请求(一个presence报文),服务器接收到此报文,将用户状态置为离线状态
第二种情况问题就来了:用户由于网络原因,连接断开了。这时服务器如何知道用户下线了呢?服务器肯定是没法立即知道用户已经下线了的。服务器有一个心跳检查,
如下图设置。如果一段时间之后,任然接收不到用户的响应,则释放连接使用户下线。也就是说,从用户网络断开连接,到服务器检查迫使用户下线这段时间,服务器
认为用户是在线的,这段时间发送给此用户的消息并不会走离线消息。这段时间的消息就丢包了。
参考:http://blog.youkuaiyun.com/yjl49/article/details/6833606
2)客户端A发送消息到客户端B,发送时由于A的网络状态不稳定,导致消息并没有发送成功。(本人是服务端的开发,不慎了解客户端的具体情况,现实情况是我们的android和ios工程师均没法判断消息发送失败了),此消息客户端B是无法接收到的。对用我们的应用用户来说,他只知道我的消息发出去,但对方没收到,丢包啦!!
问题1:修改openfire离线消息机制
参考:http://blog.youkuaiyun.com/kaixinwoo5/article/details/37320579
问题2:增加消息回执