如何定位到某一台设备
根据不同的tag进行定位,例如:
1 | { |
上面表示: 发送消息给农技员ID为12、过程为67、环境为test。又由于多台设备可以指定相同的tag,从而单条推送可以推送给多台设备。所以此处的组播意思可能就变了,根据不同的tag组合定位到不同的设备个、群体,实现组播发送,此处tag为app端设置。
关于解决友盟推送每分钟限制
官方文档限制每分钟只能发送5条消息,所以后端维持一个队列A
以及计时器
,进行分批发送,保证消息发送出去。
此队列实现思想:
- 推送请求过来,将此推送消息体保存至redis hash表中,key为uuid,value为消息体
- 将此 uuid lpush至队列A,等待任务被执行
此计时器实现思想:
- 每隔一段间隔(例如3s)进行轮询存储在队列A中的任务,如果有内容,则定位到当前时间至分钟,例如
201712100304
,利用redis incr进行操作此key,如果大于5,则表示此分钟已经发送满,则继续轮训至下分钟进行发送 - 如果执行成功,则将此uuid rpop至另外一个
队列B
,实现原子性操作,此处只能表示此任务已经被执行了,但是不能代表执行成功,此处可参考错误
错误
- 任务没有被正常执行,或者消息丢失,涉及原因可能多样
- 友盟推送返回错误,此处错误可以参考错误
对于错误1,理论应再次推入队列A
,但此处不考虑。
对于错误2,除了应用次数限制错误,其余错误可以避免。
任务以及结果存储期限
此处队列与存储均使用redis进行实现,所以理论上只要redis服务不停止,服务状态与结果均可以持久化存储,又由于推送非持久化过程,所以此处暂时满足。
定时发送消息
后端维持一个定时任务,到达时间后,会将消息推送给队列A,等待发送。
此处可以动态增、删任务。
立即发送
将此消息推到队首/尾,等待发送。
后记
转战友盟,此片结束。