来这里找志同道合的小伙伴!消息队列遥测传输(Message Queuing Telemetry Transport,简称 MQTT)是一个客户端/服务器架构的发布/订阅模式的消息传输协议。最早由IBM提出的,如今已经成为OASIS规范。由于规范很简单,非常适合需要低功耗和网络带宽有限的场景,如机器与机器的通信(M2M)以及物联网环境(IOT)。
1)使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦
2)消息传输不需要知道负载内容
3)提供三种等级的服务质量
4)很小的传输消耗和协议数据交换,最大限度减少网络流量
5)异常连接断开发生时,能通知到相关各方
1)在兼容原生客户端的前提下做集群和自动故障恢复方案。由于很多智能设备或自研、或采购自第三方,因此可能会遇到各种各样的MQTT SDK。
2)自动订阅/取消订阅,为了能够尽可能的节省网络流量,并且支持按模式批量发起订阅。给订阅关系的存储、变更通知带来一些挑战。
3)提供多种服务质量等级,JMQ本身只提供At Least Once保证。
4)使用推模式进行消息发布,使消费消息的延迟进一步降低
5)轻量级部署,为了实现高可用和支持更丰富的特性,JMQ本身包含了很多模块,并且依赖了很多第三方服务,但对于MQTT使用场景来说,一般都是互相独立小集群环境,所以整合资源,精简配置也是一个难题。
JMQ 支持 MQTT 3.1.1 协议,通过在 JMQ 核心的基础上增加 MQTT 协议网关的方式对互联网上的客户端提供服务。整个系统架构如下图所示:

Mqtt Proxy系统分层
1)连接层(Connection Layer):负责TCP连接处理、MQTT协议编解码。
MQTT 协议编解码
MQTT 协议心跳检测
MQTT 协议报文处理
并发连接数限制
流量控制
2)会话层(Session Layer):处理MQTT协议发布订阅消息交互流程。
会话层处理 MQTT 协议发布订阅(Publish/Subscribe)业务交互流程
缓存MQTT客户端的全部订阅(Subscription),并终结订阅
处理Qos0/1消息接收与下发,消息超时重传
MQTT消息流转

1)JMQ Broker只有拉模式,物联网场景需要更实时的消息传递
使用Long Pull实现Broker到Proxy之间的推送,Consumer和Proxy之间保持长连接,进行消息的推送
LongPull每次会拉取一批消息
针对质量为Qos1的消息,只拉取处在一个飞行窗口内的消息,用于防止大量积压导致最近的消息永远得不到及时处理
2)支持质量等级为Qos0和Qos1的消息
对于质量等级为Qos0的消息,从broker端取出的同时会自动ack掉
Consumer到Proxy的Publish Ack和Proxy到Broker的Ack都是并行的
3)Proxy无状态
Proxy都维护全量的订阅关系
Consumer到Proxy的链接是否存活决定了broker Consumer Proxy的生命周期
Client可以在多个Proxy之间切换
4)Broker自动选举
基于raft的自动选举机制
5)报文ID与消息ID
MQTT 协议定义了一个16bits的报文ID,用于客户端到服务器的报文收发与确认。MQTT 发布报文进入消息服务器后,需要转换为一个消息对象并分配消息ID。
MQTT订阅流程

1) 订阅关系的存储模型。
由于Mqtt按照模式批量订阅Topic,消息发布时需要进行模式匹配,决定把消息推送至哪些客户端。在设计上我们采取空间换时间
同时存储ClientId-Topic Pattern和ClientId-Topic的对应关系
增加Topic时需要更新ClientId-Topic数据,但带来的好处是根据Topic找到对应的Client列表时间复杂度变成0(1)
例如ClientId(Cat001)的Client-topic Pattern是shop/category/fruit/#,对于系统新增加的shop/category/fruit/apple主题,Cat001将会自动订阅上,并找到存活的会话,推送消息
2) 订阅关系变更通知。
Proxy和EventNotification保持长连接,接收到来自Proxy的事件之后会通知连接到EventNotification的所有Proxy
EventNotification主备结构
Proxy定时拉取Storage里的订阅关系
相比于其他开源的物联网消息队列,JMQ MQTT具有以下优势:
1、完整的兼容 MQTT 3.1.1协议。
2、完善的集群机制,容器化部署、支持弹性伸缩,水平扩容对上层透明。
3、完备的运维体系,一键接入、实时监控、自定义报警。
4、自动化故障恢复机制
5、持久化消息存储机制,保证消息高可靠
6、性能优越,支持百万级的连接请求
目前MQTT服务已经在京东线下生鲜店实施,支持购物跟随小车业务,未来我们希望能拓展至物联网的各个领域,包括不限于无人车、无人仓、无人超市、智能音响、智能冰箱,并能够跟计算平台、分析平台进行联动,发挥更大的业务价值。

京东技术 ∣关注技术的公众号

长按,识别二维码,加关注




