1. 程式人生 > >初識訊息佇列——WebSphere MQ入門

初識訊息佇列——WebSphere MQ入門

訊息佇列是什麼

訊息佇列對於我們來說應該並不陌生,訊息佇列(Message Queue,簡稱MQ),首先它是個佇列,先進先出。佇列裡面放的是訊息,訊息則指的是兩個獨立的系統之間傳遞的資料,這兩個系統可以是異構的,可以在不同的作業系統上,只需要寫一段程式碼呼叫一下提供的API既可以傳送或接收到訊息。

為什麼需要訊息佇列

這個問題的答案,我第一感覺就是解耦唄,兩個系統之間抽離了一層出來用於處理訊息傳遞,抽離出一層的好處是如果別的系統壞了也不會影響我這邊系統的正常執行。解耦這算是一個,但還有一個原因可能更為重要,非同步處理。在高併發場景中,往往同步處理容易導致阻塞,通過訊息佇列快取訊息,在某一時刻再去處理從而可以緩解系統壓力。
(以上可能理解得有些粗糙…)

JMS規範

說到訊息佇列就不得不說JMS規範了。JMS即Java訊息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向訊息中介軟體(MOM)的API。
JMS規範定義了兩種訊息通訊模型:
1.Point-to-Point(P2P)點對點
2.Publish/Subscribe(Pub/Sub)釋出訂閱
在點對點模型中,訊息生產者只需要將訊息丟到訊息佇列中就可以了,一個訊息只能有一個消費者,消費完之後訊息就從佇列中消失了。
釋出訂閱模型則涉及到一個主題(Topic)的概念,還有釋出者(Publisher)和訂閱者(Subscriber)。釋出訂閱模型允許一個訊息可以有多個接收者。訊息生產者產生一個訊息後,把這個訊息傳送到一個Topic中,這個Topic可以同時有多個接收者在監聽,當一個訊息到達這個Topic之後,所有訊息接收者都會收到這個訊息。
目前市場上大多數的訊息中介軟體都為JMS提供了實現。

訊息佇列的基本概念

以IBM WebSphere MQ為例,WebSphere MQ的結構圖如圖所示:
這裡寫圖片描述

1) 訊息

通過訊息佇列傳輸的資料我們都稱它為訊息。到了佇列裡面,訊息分成了訊息頭(訊息描述符)和訊息體兩部分,訊息頭存放了訊息的優先順序,失效時間等資訊,而訊息體放的是具體的使用者資料(可能是字串,可能是封裝好的物件等等)。此外訊息還可以分成永續性和非永續性兩種。非永續性的訊息儲存在記憶體中,效能很好但可靠性不高斷電就會消失,永續性的訊息則被儲存在硬碟中的,可靠性高,斷電可恢復。

2) 佇列

佇列是儲存訊息的地方,採用先進先出的設計保證訊息的一致性。在訊息佇列中佇列分很多種,其中包括本地佇列、遠端佇列、傳輸佇列、別名佇列等。本地佇列就是我們平時呼叫API所操作的佇列。遠端佇列是目的佇列在本地的一個引用,真正的佇列在遠端主機上,因此遠端佇列不佔用本地的儲存空間。
本地佇列
這裡寫圖片描述


遠端佇列
這裡寫圖片描述

3) 佇列管理器

佇列管理器可看成是佇列和其他物件的容器。一個佇列管理器是WebSphere MQ中的一個基本的獨立的執行單元。一臺機器上可以執行一個或多個佇列管理器。佇列管理器是MQ系統中最上層的一個概念,由它為我們提供基於佇列的訊息服務。

4) 通道

通道是訊息佇列中佇列管理器之間傳遞訊息的管道。
訊息通道:訊息通道是一種提供從一個佇列管理器到另一個佇列管理器的通訊路徑。主要用於在訊息佇列伺服器和伺服器之間傳輸訊息的。訊息通道是個單向連線,通過訊息通道代理完成兩個佇列管理器的連線。
這裡寫圖片描述
訊息通道在WebSphere MQ中分成6種類型:
1.傳送通道
2.接收通道
3.伺服器通道
4.請求器通道
5.叢集傳送通道
6.叢集接收通道
通道與通道之間要組合才能通訊,通道組合共5種,分別是:
1.傳送通道——接收通道
2.請求器通道——伺服器通道
3.請求器通道——傳送通道
4.伺服器通道——接收通道
5.叢集傳送通道——叢集接收通道
MQI通道:MQI通道是WebSphere MQ客戶端和伺服器上的佇列管理器的通訊的通道,當應用程式發出MQCONN或MQCONNX呼叫時,才開始建立連線。它是一個雙向的通道,可以負責傳送和接收。
MQI通道有兩種型別:
1.客戶端連線通道
WebSphere MQ客戶端所使用。
2.伺服器連線通道
執行佇列管理器的伺服器端所用,執行在客戶端的應用程式使用這種通道進行通訊。
基本概念性介紹大概就這些了吧。客戶端應用程式具體用起來的話,使用WebSphere MQ Java API就可輕鬆連線上訊息佇列,配好MQEnvironment的一些引數,再new出MQQueueManager例項就可以呼叫佇列傳送訊息了。具體怎麼做我就不詳細貼程式碼了。
在這裡我要說明一些新手需要注意的幾點:
1.使用者記得加入mqm使用者組。(2035報錯)
2.記得啟動佇列管理器的監聽埠(遠端管理)。(2538報錯)
3.建立的通道是伺服器連線通道。
4.伺服器連線通道的通道認證記錄阻止使用者裡把星號去掉。(2035報錯)