暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

京东消息中间件JMQ对MQTT的支持

京东技术 2018-04-02
1589
来这里找志同道合的小伙伴!

MQTT简介

消息队列遥测传输(Message Queuing Telemetry Transport,简称 MQTT)是一个客户端/服务器架构的发布/订阅模式的消息传输协议。最早由IBM提出的,如今已经成为OASIS规范。由于规范很简单,非常适合需要低功耗和网络带宽有限的场景,如机器与机器的通信(M2M)以及物联网环境(IOT)。


MQTT特点

1)使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦

2)消息传输不需要知道负载内容

3)提供三种等级的服务质量

4)很小的传输消耗和协议数据交换,最大限度减少网络流量

5)异常连接断开发生时,能通知到相关各方


JMQ支持MQTT遇到的挑战

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优势

相比于其他开源的物联网消息队列,JMQ MQTT具有以下优势:


1、完整的兼容 MQTT 3.1.1协议。

2、完善的集群机制,容器化部署、支持弹性伸缩,水平扩容对上层透明。

3、完备的运维体系,一键接入、实时监控、自定义报警。

4、自动化故障恢复机制

5、持久化消息存储机制,保证消息高可靠

6、性能优越,支持百万级的连接请求


JMQ MQTT在京东的应用

目前MQTT服务已经在京东线下生鲜店实施,支持购物跟随小车业务,未来我们希望能拓展至物联网的各个领域,包括不限于无人车、无人仓、无人超市、智能音响、智能冰箱,并能够跟计算平台、分析平台进行联动,发挥更大的业务价值。

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

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

文章转载自京东技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论