对于需要即使通知用户的业务,例如告警等,需要消息推送功能,保证通知的及时性。
消息推送涉及到消息的发送和接收,即方案既要能在后端中使用,也要能在前端和移动端使用,所以需要能适配java 和 javaScript 语言。
常规思路如下三种:
轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
推送(Push)方式:移动终端现在服务器端注册并告知关注的消息主体,服务器获得相关的消息之后,根据主体主动推送给移动终端。
常连接方式:移动终端与服务器端保持常连接,保证消息下发的及时性。
通过检索分析,选择使用push方式,并且使用MQTT协议来实现。此协议开销小,能高效地使用网络,也是物联网选择使用的一个协议。并且由于使用较多,说明资料相对来说比较丰富,便于开发使用。
消息中转代理服务使用Apache的开源工具 ActiveMQ Artemis, 它是一个多协议消息中转服务,支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets。
服务端和客户端之间通过发布和订阅方式来实现消息推送,消息的中转即通过Artemis来实现。
MQTT协议针对消息传送提供三种服务质量:
“至多一次”
消息根据底层因特网协议网络尽最大努力进行传递。 可能会丢失消息。
“至少一次”
保证消息抵达,但可能会出现重复。
“刚好一次”
确保只收到一次消息。
因此我们可以根据具体的业务需要来设置服务质量参数QoS,同时通过主题Topic来区分不同的业务来推送给不同的用户。
关于中转服务器的选择,分析了三种服务器,都是开源项目,分别为Apache的 Apollo 、Artemis 还有国内的EMQ, 其中Apollo 操作虽然简洁,但是已经很久没有更新维护了,而国内的EMQ 从使用来看不如Apache的便利,并且其使用Erlang语言开发,非常规开发语言,对于后期使用维护不太方便。综合来看,Artemis的功能比较完备,并且版本一直有在更新维护,使用的是Java语言开发,遇到问题可以从开源社区寻求获取解决方案。
中转消息服务器Artemis信息显示页面
连接会话:
服务器使用情况:
五:参考文档
1、消息中转服务Artemis 说明:
http://activemq.apache.org/artemis/
其开源项目代码地址:
https://github.com/apache/activemq-artemis
https://github.com/eclipse/paho.mqtt.java
https://github.com/eclipse/paho.mqtt.android
https://github.com/eclipse/paho.mqtt.javascript
注意使用对应的库,来进行对应的调用,其JS库有两个版本:
@namespace Paho
@namespace Paho.MQTT
https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html
中文翻译版本:
https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html
https://github.com/mqtt/mqtt.github.io/wiki/brokers