mqtt:一種通訊協議,相似人類交談中的漢語、英語、俄語中的一種語言規範
MQ:一種通訊通道,也叫消息隊列,相似人類交談中的用電話、email、微信的一種通訊方式
json:一種內容格式,相似人類交談中的排比句等方式web
市面上的MQ產品不少,如阿里自研並開源RocketMQ,還有相似RabbitMQ、ActiveMQ,他們無論支持MQTT協議,還支持如AMQP、stomp協議等等,EMQ 使用的協議是mqtt。json
有三個基本概念:消息、消息協議、消息隊列。微信
消息:信息的載體
消息協議:爲了讓消息發送者和消息接收者都可以明白消息所承載的信息(消息發送者須要知道如何構造消息;消息接收者須要知道如何解析消息),它們就須要按照一種統一的格式描述消息,這種統一的格式稱之爲消息協議。因此,有效的消息必定具備某一種格式;而沒有格式的消息是沒有意義的。
消息隊列:消息從發送者到接收者的方式也有兩種。
一種爲即時消息通信,也就是說消息從一端發出後(消息發送者)當即就能夠達到另外一端(消息接收者),這種方式的具體實現就是咱們已經介紹過的RPC(固然單純的http通信也知足這個定義);
另外一種爲延遲消息通信,即消息從某一端發出後,首先進入一個容器進行臨時存儲,當達到某種條件後,再由這個容器發送給另外一端。 這個容器的一種具體實現就是消息隊列,如RabbitMQ。架構
從上圖能夠看到,某一種消息通信軟件(或者叫作程序庫)的實現都創建在「協議」基礎上:RMI程序庫創建在RMI協議上(RMI協議是JAVA規範協議的一部分) ,屬於一種「即時消息通信」;RabbitMQ和Qpid消息通信軟件的設計依據是AMQP協議,屬於一種「延遲消息通信」。優化
雖然消息協議存在「私有協議」和「開放協議」之分(是否向行業開放消息規範文檔、是否容許某個組織更改協議),雖然某一個軟件(程序庫)不必定只支持一種協議(例如ActiveMQ實現了多種消息協議),雖然某一種協議也不必定只有一種軟件(程序庫)實現(例如可以支持webservice協議的程序庫就有Codehaus XFire、Apache CXF、Jboss RESTEasy等),可是這並不影響「某一種消息通信軟件(或者叫作程序庫)的實現都創建在「協議」基礎上」的概念,反而是這個基本概念增強了。
AMQP的實現產品(例如RabbitMQ)spa
ActiveMQ是Apache軟件基金會的開源產品,支持AMQP協議、MQTT協議(和XMPP協議做用相似)、Openwire協議和Stomp協議等多種消息協議。而且ActiveMQ完整支持JMS API接口規範。.net
RabbitMQ基於Erlang語言開發和運行。它與Apache ActiveMQ有不少相同的特性,例如RabbitMQ完整支持多種消息協議:AMQP、STOMP、MQTT、HTTP,咱們使用RabbitMQ時會默認使用AMQP1.0 協議。固然,RabbitMQ做爲Apache ActiveMQ最主要的競品之一也有其獨特的功能特性。例如RabbitMQ支持一套特有的Routing-Exchange消息路由規則。這套規則能夠按照消息內容,自動將消息歸類到不一樣的消息隊列中。設計
MQTT在我看來就是一個簡單的發佈訂閱協議, 提供一種服務質量的概念。EMQ則是對MQTT協議進行了實現,做爲一個Broker,從Pub端到Broker是一個完整的MQTT交互,Broker到Sub端是一個完整的MQTT交互, 而Broker內部則是進行了消息的傳遞。點擊查看EMQ原理。blog
說白了都是傳統消息系統(老爸)的子嗣,只是與不一樣的場景(老媽)結合的產物。不過,二者卻能夠結合起來使用。好比能夠用MQTT接受物聯網設備上傳的數據,而後接入Kafka,最後能夠同時分發到HDFS歸檔、數據倉庫作OLAP分析、Elasticsearch作全文檢索,這樣的架構很是適合大型物聯網項目,不但可以處理海量數據同時也具備很好的擴展性。接口
MQTT是在TCP之上的應用層協議,對物聯網應用環境作了很是多的優化,TCP是傳輸層協議,是更通用層的協議。
原文連接:https://blog.csdn.net/wzhqazcscs/article/details/79364902