很多时候我们谈到MQTT,发现其和MQ的很多概念是一致的。那么MQTT也是一种MQ吗?MQTT 并不是消息队列,尽管两者的很多行为和特性非常接近,比如都采用发布订阅模式等,但是他们面向的场景有着显著的不同。

MQTT和MQ的主要区别

  • MQTT:一种通信协议,类似人类交谈中的汉语、英语、俄语中的一种语言规范。
  • MQ:一种通信通道,也叫消息队列,类似人类交谈中的用电话、email、微信的一种通信方式。

MQ(Message Queue)是一种通用的消息队列技术,主要用于在应用程序之间传递消息。它提供了一种异步通信方式,使得发送方不需要等待接收方的响应,从而提高了系统的可扩展性和可伸缩性。MQ通常用于企业级应用程序,如分布式系统、实时应用和数据存储等。

很多MQ产品,如阿里自研并开源的RocketMQ,还有RabbitMQ、ActiveMQ,他们不仅支持MQTT协议,还支持如AMQP、stomp协议等等,EMQX默认使用的协议是MQTT。

还可以从下面几个维度比较:

  • 应用场景:MQTT主要用于物联网设备之间的通信,而MQ适用于在应用程序之间传递消息
  • 设计目标:MQTT注重低带宽、低功耗和网络不稳定的环境,而MQ关注于提高系统的可扩展性和可伸缩性
  • 消息类型:MQTT主要用于发布/订阅模式,而MQ支持多种消息类型,如点对点、发布/订阅、请求/响应等
  • 协议规范:MQTT具有统一的协议规范,使得不同供应商的设备之间可以互相通信。而MQ则有多种实现方式和协议规范
  • 安全性:MQTT可以通过TLS/SSL协议进行加密传输,从而保障通信安全。而MQ则采用多种安全机制,如身份认证、权限控制等

消息、消息协议、消息队列

  • 消息:信息的载体。
  • 消息协议:为了让消息发送者和消息接收者都能够明白消息所承载的信息(一方编码,另一方解码),它们就需要按照一种统一的格式描述消息,这种统一的格式称之为消息协议。所以,有效的消息一定具有某一种格式;而没有格式的消息是没有意义的。
  • 消息队列:消息从发送者到接收者的方式也有两种。一种直接消息通讯,也就是说消息从一端发出后立即就可以达到另一端,比如RPC和HTTP通讯;另一种为代理消息通讯,即消息首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给接收者(可能不止一个), 这个容器的一种具体实现就是消息队列。

可以这样理解:MQTT Broker是符合MQTT通信协议规范的一类消息队列产品。

MQTT+Kafka

在实际的场景中,两者往往被结合起来使用,譬如先由 MQTT Broker 接收物联网设备上传的数据,然后通过消息队列MQ将这些数据转发到具体应用进行处理。

image-20241004214418431

上图是一种比较典型的应用架构,MQTT Broker适合对海量设备的高效订阅发布服务,但针对海量数据的高可用持久化存储并高效查询普遍力不从心,这给了像Kafka这样的顶级选手机会。在一些场合将两者结合使用事半功倍,MQTT Broker侧重在内存中高效处理数据,Kafka侧重在磁盘中持久化海量数据。

参考阅读:

https://zhuanlan.zhihu.com/p/575624386

(完)