共享行业的分布式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来实现。

图片描述

Broker内部服务框架
为了管理,以及设计方便,我们将内部服务抽象成为很多独立服务,这些服务包括:
1.Authentication and authorization service
a)该服务负责用户名,密码等认证方式的鉴权,以及每个client对于那些主题有权限进行读和写,后台数据全部保存在Mysql,通过redis做cache加速,当然也做in memory的cache加速,cache回收机制采用LRU策略
2.Session Manager
a)持久化session管理,

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值