MPUSH开源推送系统官网[https://mpusher.github.io]
MPush作为一个实时消息推送系统。
举一个场景,某手机客户端接收不到服务端推送的消息,需要我们排查原因。
一、从如下步骤入手排查。
1、该手机客户端是否上线?如果是则步骤2;带着这个问题,我们看下消息推送正常流程。
二、消息推送正常流程
接下来我们调试一下程序。
三、调试步骤
步骤3、打开MPushAndroid,填写Alloc服务器地址( http://103.60.220.145:9999/ ),
注意以http://开头,且加端口号,点击Start。
四、逻辑分析
1、当调度器(alloc)启动的时候,服务端接收到调度器alloc链接的信息,如下图:
注意:服务端IP与端口信息 L:/172.31.64.234:3001,端口是3001。
2、服务端监听客户端上线
当客户端向服务端建立连接的时候,服务端接收到客户端上线消息,日志如下:
注意:服务端IP与端口信息 L:/172.31.64.234:3000,端口是3000;客户端IP与端口信息 R:/172.31.98.77:55971。
3、服务端向客户端发送消息、发送结果
服务端发送消息到客户端,看下发送结果。
在浏览器输入:http://127.0.0.1:9999/index.html,点击发送,界面弹出“服务已经开始推送,请注意查收消息”。
我们不相信页面的结果,我们看下发送日志:
说明:这个日志是alloc调度器打印的日志,因为上面这个demo是在调度器调用mpush-client(服务端SDK)发送消息的。发送方法有个Callback的方法,返回发送结果。
这时候,我们再看服务端的日志:
19:43:01.204 -[push]- [SingleUserPush] push message to client success, timeLine=TimeLine[3](ms){push-center-begin --(0ms) --> before-send --(3ms) --> success-end}, message=GatewayPushMessage{userId='user-0', clientType='1', timeout='2500', content='183'}
也显示了发送结果。
4、服务端监听客户端下线
如果客户端下线了,通过心跳,服务端可以监听到客户端下线的消息,日志如下:
20:43:54.277 - [mp-event-p-1-t-1] INFO - com.mpush.common.user.UserManager - user offline user-0
截图如下:
五、总结
消息推送系统,跟发短信、发邮件、发微信其实是一样原理的。
1、短信发送服务,业务系统调用第三方短信网关接口,短信网关会同步返回发送结果到业务系统,
如果发送失败了,业务系统会重试。
2、邮件发送服务,业务系统调用邮件SDK,实现发送功能,返回发送结果。
3、消息推送系统,调用SDK发送消息时,返回发送结果,如果失败了,尝试N次,如果还是失败,则保存为离线消息。
4、至于消息是否丢失了,客户端是否读取到了消息,服务端可以不用太关注,只管发送方结果就可以了,
这样服务端和客户端的业务就解耦了。