1. 程式人生 > >MQ(訊息佇列)簡介

MQ(訊息佇列)簡介

一:概念
MQ(message queue):MQ是一種應用程式對應用程式的通訊方法。應用程式通過寫和檢索出入列隊的針對應用程式的資料(訊息)來通訊,而無需專用連線來連結它們。
訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過程呼叫的技術。排隊指的是應用程式通過佇列來通訊。佇列的使用除去了接收和傳送應用程式同時執行的要求。

二:AMQP協議介紹
AMQP,即Advanced Message Queuing Protocol,高階訊息佇列協議,是應用層協議的一個開放標準,為面向訊息的中介軟體設計。
AMQP的主要特徵是面向訊息、佇列、路由(包括點對點和釋出/訂閱)、可靠性、安全。
AMQP在訊息提供者和客戶端的行為進行了強制規定,使得不同賣商之間真正實現了互操作能力。

三:JMS協議介紹
JMS(Java Messaging Service)是Java平臺上有關面向訊息中介軟體的技術規範,它便於訊息系統中的Java應用程式進行訊息交換,並且通過提供標準的產生、傳送、接收訊息的介面簡化企業應用的開發。
詳情請移步至另一篇文章:http://blog.csdn.net/ruben95001/article/details/78363043

四:STOMP協議介紹
STOMP,Streaming Text Orientated Message Protocol,是流文字定向訊息協議,是一種為MOM(Message Oriented Middleware,面向訊息的中介軟體)設計的簡單文字協議。
它提供了一個可互操作的連線格式,允許STOMP客戶端與任意STOMP訊息代理(Broker)進行互動,類似於OpenWire(一種二進位制協議)。其中最流行的STOMP訊息代理是Apache ActiveMQ。
博主最初接觸到的MQ就是ActiveMQ,當時的業務需求就是,要求使用者通過WeChat的微信系統與我司研發的一款APP之間進行相互通訊。起初博主當時打算是用第三方的服務,例如環信,但是在熟讀其文件後,發現與你使用者體系有些不一致。便開始獨立研發一套獨立的通訊系統,基於ActiveMQ。

五:MQ基本概念
1:訊息(Message)
訊息是MQ中最小的概念,本質上就是一段資料,它能被一個或者多個應用程式所理解,是應用程式之間傳遞的資訊載體。
2:佇列(Queue)
2.1:本地佇列
本地佇列按照功能可劃分為初始化佇列,傳輸佇列,目標佇列和死信佇列。
2.1.1:初始化佇列用作訊息觸發功能。
2.1.2:傳輸佇列只是暫存待傳的訊息,條件許可的情況下,通過管道將訊息傳送到其他的佇列管理器。
2.1.3:目標佇列是訊息的目的地,可以長期存放訊息。
2.1.4:如果訊息不能送達目標佇列,也不能再路由出去,則被自動放入死信佇列儲存。
2.2:別名佇列&遠端佇列
只是一個佇列定義,用來指定遠端佇列管理器的佇列。使用了遠端佇列,程式就不需要知道目標佇列的位置。
2.3:模型佇列
模型佇列定義了一套本地佇列的屬性結合,一旦開啟模型佇列,佇列管理器會按照這些屬性動態地創建出一個本地佇列。
3:佇列管理器(Queue Manager)
佇列管理器是一個負責嚮應用程式提供訊息服務的機構,如果把佇列管理器比作資料庫,那麼佇列就是其中一張表。
4:通道(Channel)
通道是兩個管理器之間的一種單向點對點的的通訊連線,如果需要雙向交流,可以建立一對通道。
5:監聽器(listner)

六:MQ產品的特性
6.1:可靠性傳輸
對於應用來說,只要成功把資料提交給訊息中介軟體,那麼關於資料可靠傳輸的問題就由訊息中介軟體來負責。
6.2:不重複傳輸
不重複傳播也就是斷點續傳的功能,特別適合網路不穩定的環境,節約網路資源。
6.3:非同步性傳輸
非同步性傳輸是指,接受資訊雙方不必同時線上,具有離線能力和安全性。
6.4:訊息驅動
接到訊息後主動通知訊息接收方。
6.5:支援事務
目前MQ也廣泛被一些企業用於對於分散式事務的同步。

7:常用的場景
7.1:訊息通道
例如博主之前運用的場景就是把MQ作為一種訊息通道在APP與微信之間進行一對一或釋出/訂閱式的通訊。其機制入下:
這裡寫圖片描述
7.2:訊息匯流排機制
在如今的SOA架構活著微服務架構中,這普遍使用,例如上面談到的事務的同步問題。各個服務之間的通訊,可以確保資料的一致性。
機制如下:
這裡寫圖片描述

八:常見的MQ對比
8.1:RabbitMQ
是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。同時實現了一個經紀人(Broker)構架,這意味著訊息在傳送給客戶端時先在中心佇列排隊。對路由(Routing),負載均衡(Load balance)或者資料持久化都有很好的支援。
8.2:ActiveMQ
是Apache下的一個子專案。 類似於ZeroMQ,它能夠以代理人和點對點的技術實現佇列。同時類似於RabbitMQ,它少量程式碼就可以高效地實現高階應用場景。RabbitMQ、ZeroMQ、ActiveMQ均支援常用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等。
8.3:Kafka
Kafka是Apache下的一個子專案,是一個高效能跨語言分散式Publish/Subscribe訊息佇列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行訊息持久化;高吞吐,在一臺普通的伺服器上既可以達到10W/s的吞吐速率;完全的分散式系統,Broker、Producer、Consumer都原生自動支援分散式,自動實現複雜均衡;支援Hadoop資料並行載入,對於像Hadoop的一樣的日誌資料和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的並行載入機制來統一了線上和離線的訊息處理,這一點也是本課題所研究系統所看重的。Apache Kafka相對於ActiveMQ是一個非常輕量級的訊息系統,除了效能非常好之外,還是一個工作良好的分散式系統。
8.4:RocketMQ
RcoketMQ 是一款低延遲、高可靠、可伸縮、易於使用的訊息中介軟體。具有以下特性:
1.支援釋出/訂閱(Pub/Sub)和點對點(P2P)訊息模型
2.在一個佇列中可靠的先進先出(FIFO)和嚴格的順序傳遞
3.支援拉(pull)和推(push)兩種訊息模式
4.單一佇列百萬訊息的堆積能力
5.支援多種訊息協議,如 JMS、MQTT 等
6.分散式高可用的部署架構,滿足至少一次訊息傳遞語義
7.提供 docker 映象用於隔離測試和雲集群部署
詳細資訊請跳轉:http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/