1、Mosquito简介
Mosquito是一款实现了消息推送协议MQTT v3.1 的开源消息代理软件,由MQTT协议创始人之一的Andy Stanford-Clark开发,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单。
2、Mosquito订阅树
Mosquitto通过订阅树的方式来管理所有的topic以及客户端的订阅关系,它首先将所有的topic按照/分割并组织成一棵树结构,从根节点到树中的每个节点即组成该节点所对应的一个topic,每个topic都保存一个订阅列表,该订阅列表中保存了所有订阅当前topic的客户端信息。
例如有如下订阅关系:
客户端a1,a2,a3订阅了topic:A1/B1/C1
客户端b1,b2订阅了topic:A2/B2/C2
客户端c1,c2订阅了topic:A1/B1/C3
客户端d1订阅了topic:A2/B3
2.1、Mosquito业务子树和系统子树
Mosquitto程序根据topic消息的性质将订阅树分为两颗子树:业务子树和系统子树;mosquitto程序中将topic分为两种类型来处理:系统topic和业务topic,前者主要用于发布和维护mosquitto内部的系统消息,后者的topic是用户订阅的业务topic,做这种区分的原因是因为这两种的类型的topic性质和实现方式上有许多差别,这种差别主要体现在以下3点:
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)。其工作过程为:
2.5、mosquito的ping/pong功能
Mosquito以keepalive*1.5时间作为判断客户端连接是否异常断开的时间界限,这里keepalive的值对mosquito的性能会产生较大影响,此值过大,可能无法及时判断处异常的发生;此值过小,不仅浪费网络带宽,还可能造成误判,例如客户端与服务器之间tcp连接上的某个服务器异常重启,可能会被服务器误判为tcp连接断开了。此值需根据实际情况分析后确定。