共享行业的分布式共享行业的分布式MQTT设计设计
背景
随着移动互联网慢慢进入后半场,越来越多的公司将注意力转移到物联网,希望通过早期布局来起到占领这个行业的制高
点,比如目前流行的摩拜单车,比如目前流行的摩拜单车,OFO 单车都是典型的物联网应用单车都是典型的物联网应用。物联网本身并不是什么新概念,随着大数据,AI 等技术的
发展,大家意识到传统的物联网通过一定改造,借助大数据以及 AI 技术可以获得很多额外的价值。
这里主要介绍物联网的接入服务,物联网主流接入协议分为 MQTT,,CoaP,,Http,,XMPP等几种,本文主要是介绍 MQTT 协
议的优缺点以及如何实现 MQTT 的分布式框架,至于各个协议之间的比较就不再这里详细介绍,大家可以百度相关资料去做
详细了解。
MQTT 协议主要特点
MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以
下主要的几项特性:
1. 使用发布 / 订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2. 对负载内容屏蔽的消息传输;
3. 使用 TCP/IP 提供网络连接;
4. 有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数
据,丢失一次记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6. 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
MQTT 主要应用场景
1. 车联网
2. 工业物联网
3. 智能家居
4. 视频直播弹幕
5. IM 实时聊天 (一对一聊天,群组聊天)
6. 推送服务,比如推送实时新闻
7. 金融交易数据订阅推送
整体架构
单机版本的 MQTT 存在并发连接数上限以及处理能力的限制,主流的单机版本的 MQTT 服务包括 ActiveMQ,
RabbitMQ,Apollo,Mosquitto,分布式的 MQTT 服务包括知名的 EMQ, VerneMQ 都是采用 Erlang 实现的。
分布式版本的 MQTT 相对于单机版本最大的难点在于 Session 的管理,特别是持久化 session,MQTT 协议定义了两种
Session,其中一种是 transient Session,另外一种是 Persistent Session,用户可以通过在发送连接协议包的时候设置 clean
session 这个状态位来决定采用哪种 session。另外一个难点就是集群的管理,这里设计的框架是每个 broker 都是对等,他们
之间不存在什么主从关系,所以我们直接 AKKA Cluster 这个框架作为集群管理,每个 broker 都需要注册监听的时间包括
MemberUp,MemberDown,MemberUnreachable,ClusterMemberState 等事件,这样每个 broker 就很可以很好的感知其
他节点的状态,对内部的 session 做相应的处理,broker 和 broker 之间的消息通知采用 Akka actor 来实现。