MQTT MQTT 与 MQ 的区别

sds · 2020年09月02日 · 43 次阅读

MQTT 与 MQ 的区别:

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

市面上的 MQ 产品很多,如阿里自研并开源 RocketMQ,还有类似 RabbitMQ、ActiveMQ,他们不管支持 MQTT 协议,还支持如 AMQP、stomp 协议等等,EMQ 使用的协议是 mqtt。

详细区别:

有三个基本概念:消息、消息协议、消息队列。

消息:信息的载体

消息协议:为了让消息发送者和消息接收者都能够明白消息所承载的信息(消息发送者需要知道如何构造消息;消息接收者需要知道如何解析消息),它们就需要按照一种统一的格式描述消息,这种统一的格式称之为消息协议。所以,有效的消息一定具有某一种格式;而没有格式的消息是没有意义的。

消息队列:消息从发送者到接收者的方式也有两种。

  • 一种为即时消息通讯,也就是说消息从一端发出后(消息发送者)立即就可以达到另一端(消息接收者),这种方式的具体实现就是我们已经介绍过的 RPC(当然单纯的 http 通讯也满足这个定义);

  • 另一种为延迟消息通讯,即消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端。 这个容器的一种具体实现就是消息队列,如 RabbitMQ。

MQTT与MQ 的区别

从上图可以看到,某一种消息通讯软件(或者叫做程序库)的实现都建立在 “协议” 基础上:RMI 程序库建立在 RMI 协议上(RMI 协议是 JAVA 规范协议的一部分),属于一种 “即时消息通讯”;RabbitMQ 和 Qpid 消息通讯软件的设计依据是 AMQP 协议,属于一种 “延迟消息通讯”。

虽然消息协议存在 “私有协议” 和 “开放协议” 之分(是否向行业开放消息规范文档、是否允许某个组织更改协议),虽然某一个软件(程序库)不一定只支持一种协议(例如 ActiveMQ 实现了多种消息协议),虽然某一种协议也不一定只有一种软件(程序库)实现(例如能够支持 webservice 协议的程序库就有 Codehaus XFire、Apache CXF、Jboss RESTEasy 等),但是这并不影响 “某一种消息通讯软件(或者叫做程序库)的实现都建立在 “协议” 基础上” 的概念,反而是这个基本概念加强了。

AMQP 的实现产品(例如 RabbitMQ)

ActiveMQ 是 Apache 软件基金会的开源产品,支持 AMQP 协议、MQTT 协议(和 XMPP 协议作用类似)、Openwire 协议和 Stomp 协议等多种消息协议。并且 ActiveMQ 完整支持 JMS API 接口规范。

RabbitMQ 基于 Erlang 语言开发和运行。它与 Apache ActiveMQ 有很多相同的特性,例如 RabbitMQ 完整支持多种消息协议:AMQP、STOMP、MQTT、HTTP,我们使用 RabbitMQ 时会默认使用 AMQP1.0 协议。当然,RabbitMQ 作为 Apache ActiveMQ 最主要的竞品之一也有其独特的功能特性。例如 RabbitMQ 支持一套特有的 Routing-Exchange 消息路由规则。这套规则可以按照消息内容,自动将消息归类到不同的消息队列中。

EMQ 与 MQ 的区别

MQTT 在我看来就是一个简单的发布订阅协议, 提供一种服务质量的概念。EMQ 则是对 MQTT 协议进行了实现,作为一个 Broker,从 Pub 端到 Broker 是一个完整的 MQTT 交互,Broker 到 Sub 端是一个完整的 MQTT 交互, 而 Broker 内部则是进行了消息的传递。点击查看 EMQ 原理。

说白了都是传统消息系统(老爸)的子嗣,只是与不同的场景(老妈)结合的产物。不过,两者却可以结合起来使用。比如可以用 MQTT 接受物联网设备上传的数据,然后接入 Kafka,最后可以同时分发到 HDFS 归档、数据仓库做 OLAP 分析、Elasticsearch 做全文检索,这样的架构非常适合大型物联网项目,不但能够处理海量数据同时也具有很好的扩展性。

MQTT 是在 TCP 之上的应用层协议,对物联网应用环境做了非常多的优化,TCP 是传输层协议,是更通用层的协议。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册