服务端SDK
1. 使用方式
添加maven依赖
<dependency> <groupId>com.github.mpusher</groupId> <artifactId>mpush-client</artifactId> <version>0.0.2</version> </dependency>
在工程
resources
目录增加配置文件application.conf
,并配置zookeeper
mp.zk.namespace=mpush mp.zk.server-address="127.0.0.1:2181"
使用
com.mpush.api.push.PushSende.java
进行推送,使用其create
方法创建服务,start
方法启动服务,stop
方法停止服务。推送接口定义如下:public interface PushSender extends Service { /** * 创建PushSender实例 * * @return PushSender */ static PushSender create() { return SpiLoader.load(PusherFactory.class).get(); } /** * 推送push消息 * * @param context 推送参数 * @return FutureTask 可用于同步调用 */ FutureTask<Boolean> send(PushContext context); }
2. 推送流程
2.1. 流程图
2.2. 流程分析
PushSender
启动后首先从ZK里获取可用的GatewayServer
列表,然后创建相应的Client
分别连接到对应的GatewayServer
- 当调用
send
方法去推送时,PushSender
首先会通过RemoteRouterManager
查询要推送的用户当前所登录的机器IP,然后通过IP选择GatewayServer
并通过第1中对应的Client
把消息发送到该机器,因为该机器拥有用户的链接。 GatewayServer
接收到Client
发送过来的消息后,首先通过查询本地路由LocalRouterManager
找到用户连接Connection
,该链接是连接到ConnectionServer
的。- 如果连接存在,
ConnectionServer
会通过此连接把消息下发到客户端。 - 如果推送成功,
GatewayServer
会发送消息推送成功的消息给PushSender
所持有的Client
PushSender
收到推送成功消息后,会通过Callback#onSuccess
回调调用方,整个推送流程结束。- 如果中间有任何失败则回调
Callback#onFailure
。 - 如果用户不在线则回调
Callback#onOffline
。 - 如果在一定时间内
PushSender
没有收到GatewayServer
响应的消息则推送超时,回调Callback#onTimeout
通知调用方。
3. 源码解读
PushSender
的实现类为com.mpush.client.push.PushClient.java
PushClient
使用的是ConnectionRouterManager
该类继承自RemoteRouterManager
增加了本地缓存可在消息频繁时减轻Redis
压力,但会存在一定情况的误判。com.mpush.client.push.PushRequestBus.java
用于维持异步推送任务,线程的调整可通过配置设置,任务的拒绝策略为在调用线程执行Callback。具体见DefaultThreadPoolFactory.java
。线程池默认配置如下:mp.thread.pool.push-callback={ min:2//核心线程数 max:2//最大线程数 queue-size:0//队列大小 }
GatewayClient
会根据GatewayServer
的运行状态自行调整,如果有GatewayServer
宕机对应的Client
会及时销毁,如果有新的机器进来,对应Client
也会自动创建。具体参见GatewayClientFactory.java
。