MQTT 和其他消息队列的传输协议有什么不同?
MQTT 就是专门为物联网设备设计的一套标准的消息队列通信协议。使用 MQTT 协议的 IoT 设备,可以连接到任何支持 MQTT 协议的消息队列上,进行通信。
虽然 MQTT 和普通的消息队列相比,在消息模型、功能和网络结构上都是差不多的,但由于他们面对的使用场景是不一样的,所以,MQTT 和普通的消息队列相比,还是有很多区别的。我们看一下 MQTT 的使用场景有什么样的特点?
- 首先,它的客户端都是运行在 IoT 设备上。这种设备不能和我们普通消息队列的客户端比,Iot的设备成本非常低所以性能非常低,客户端网络也不稳定。(例如一台自行车,一个水杯)
- MQTT 面临的使用场景中,另外一个很重要的特点就是,服务端需要支撑海量的 IoT 设备同时在线。普通的消息队列通常都是10w以下的客户端接入就足够业务使用了。
- 另外,MQTT 它是不支持点对点通信的,一般的做法都是,每个客户端都创建一个以自己 ID 为名字的主题,然后客户端来订阅自己的专属主题,用于接收专门发给这个客户端的消息。这就意味着,在 MQTT 的集群中,主题的数量是和客户端的数量基本是同一个量级的。
如何选择 MQTT 产品?
RocketMQ 它的元数据是保存在 NameServer 的内存中,Kafka 是保存在 ZooKeeper 中,这些存储都不擅长保存大量数据,所以也支撑不了太多的客户端和主题,其实绝大部分常规的消息队列都不支持这种大量客户端和topic场景,所以基于这种常规的消息队列做二次开发的意义不大。
10w以内的客户端连接可用选择开源的MQTT产品,他们通常都不支持集群模式;
10w以上客户端连接的,
- 这种情况建议选择一些云平台厂商提供的 MQTT 云服务,价格相对比较低,当然你可以选择价格更高的商业版 MQTT Server。
- 另外一个选择就是,基于已有的开源 MQTT Server,通过一些集成和开发,来自行构建 MQTT 集群。