【问题描述】
移动端的丢消息大概是这个样子。A和B通讯,A发了一条消息给服务器,服务器发给B,但是B网络不好掉线了,而服务器却不知道B退出了(B正常退出会给服务器发下线通知),所以消息丢失了。XMPP中有xep-0184协议(消息回执),A给B发消息,消息体中带一行代码(要求消息回执),当B收到消息后发送一条回执,证明我收到了。后来XMPP又有了xep-0198协议(流管理),断线后快速重链,同时判断一定时间收不到消息,就把消息写离线消息,减少丢消息情况。但是可能网络情况复杂,加上各种不确定因素,还会出现丢消息的问题。
【解决方案】————标黄内容可以不用配置
init.propretites 配置文件中添加如下内容:
#ping 心跳超时时间,1分钟
c2s/watchdog_timeout[L]=60000
#监督时间间隔,每30秒
c2s/watchdog_delay[L]=20000
#最大静止时间
c2s/max-inactivity-time[L]=120
#watchdog ping包类型
c2s/watchdog_ping_type=xmpp
【参数说明】
--watchdog_delay 心跳检测间隔时间,写检测,默认值10分钟,现在修改为30秒
--watchdog_ping_type watchdog ping包类型,写操作,whitespace和xmpp
--watchdog_timeout 心跳超时时间,默认29分钟,现改为1分钟
--max-inactivity-time 最大保活稳定时间,默认24小时,现改为2分钟
【相关原理】
服务器根据 watchdog_delay 配置时间对该客户端进行轮询监督,如果当前用户会话的最后传输时间(last transfer=当前时间减去最后发送或接收时间)大于(当前时间+max-inactivity-time 时间),则自动释放用户连接。如果最后传输时间(last transfer=当前时间减去最后发送或接收时间)大于 watchdog_timeout 时间,主动发心跳包,如果客户端不能回应,则断开该用户连接。(配置时,max-inactivity-time必须大于watchdog_timeout)