MQTT简介之四 Mosquito

1、Mosquito简介

Mosquito是一款实现了消息推送协议MQTT v3.1 的开源消息代理软件,由MQTT协议创始人之一的Andy Stanford-Clark开发,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单。

2、Mosquito订阅树

Mosquitto通过订阅树的方式来管理所有的topic以及客户端的订阅关系,它首先将所有的topic按照/分割并组织成一棵树结构,从根节点到树中的每个节点即组成该节点所对应的一个topic,每个topic都保存一个订阅列表,该订阅列表中保存了所有订阅当前topic的客户端信息。

例如有如下订阅关系:

客户端a1,a2,a3订阅了topicA1/B1/C1

客户端b1,b2订阅了topicA2/B2/C2

客户端c1,c2订阅了topicA1/B1/C3

客户端d1订阅了topicA2/B3

2.1、Mosquito业务子树和系统子树

Mosquitto程序根据topic消息的性质将订阅树分为两颗子树:业务子树和系统子树;mosquitto程序中将topic分为两种类型来处理:系统topic和业务topic,前者主要用于发布和维护mosquitto内部的系统消息,后者的topic是用户订阅的业务topic,做这种区分的原因是因为这两种的类型的topic性质和实现方式上有许多差别,这种差别主要体现在以下3点:

生存周期不同,系统topic无论是否有用户订阅都会存在与订阅树中,而业务topic必须有客户端订阅才能存在(除非其消息字段retain设置为1);
创建方式不同,系统topic在消息发布时进行创建,业务topic即可以在订阅时创建也可以在消息发布时创建(此时需要该消息retain字段设置为1);
消息保存方式不同,凡是发布到系统topic的消息都会被保存下来,业务消息将直接挂到订阅列表的各context的消息队列中,如果没有连接订阅或未设置其retain字段,消息将不会被保存下来;
 

2.2、Mosquito消息发送

消息发送过程主要通过遍历订阅树来完成,具体为:递归遍历订阅树找到指定的订阅列表,并将消息挂到订阅列表中的每个contextg的消息队列中,如果消息的retain字段被设置为1,则mosquitto还需要保存此消息,以备新订阅的客户端可以立即收到上次发送的消息

2.3、Mosquito订阅树优缺点

Mosquito程序采用订阅树形式维护客户端之间的订阅与发布消息:

优点:逻辑清晰,便于开发和维护。

缺点:其遍历过程效率较低。同时,程序中存在很多对订阅树的遍历过程:订阅、发布消息、取消订阅等,在客户端数量增加时,该功能对效率的影响将更为明显。

所以,在mosquito的实际应用中很难支持5万以上的客户端,尤其在客户端网络状态不好时,其断开重练操作将非常频繁,这样也造成大量对订阅树的遍历操作,从而严重影响mosquitto的效率。

2.4、mosquito的消息收发机制

Poll机制是一种I/O多路转接(I/O multiplexing)技术,这种技术先构造一个有关描述符的表,然后调用一个函数,知道这些描述符中的一个已准备就绪好进行I/O时,该函数才返回,该函数返回之后它告诉进程那些描述符已经准备好进行I/O)。其工作过程为:

首先构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其所关心的状态。
为每一个需要监听状态的设备描述符创建一个pollfd结构体,并将之放入pollfd结构数组中。
调用函数poll监控pollfd结构数组中每个结构体的状态。

 

2.5、mosquitoping/pong功能

      Mosquito以keepalive*1.5时间作为判断客户端连接是否异常断开的时间界限,这里keepalive的值对mosquito的性能会产生较大影响,此值过大,可能无法及时判断处异常的发生;此值过小,不仅浪费网络带宽,还可能造成误判,例如客户端与服务器之间tcp连接上的某个服务器异常重启,可能会被服务器误判为tcp连接断开了。此值需根据实际情况分析后确定。

 

 

https://blog.csdn.net/houjixin/article/details/21463965?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase

 
 
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值