1. 程式人生 > >訊息佇列,不懂你就Out啦!

訊息佇列,不懂你就Out啦!

為什麼要懂訊息佇列

在程式設計師的工作和學習中,如果是比較成熟的專案,基本上都會涉及到分散式啊、訊息佇列啊、高併發啊、高可用啊、高效能啊、快取啊等各種相對來說比較高階的技術點。
關於訊息佇列,這個東西是大家一定要懂的,不懂行不行?如果對技術有追求,還是得好好研究下,最好在專案中用到它。

一、什麼是訊息佇列

學習一個東西,一定要先研究百科是怎麼解釋的。
訊息佇列的維基百科:訊息佇列
在電腦科學中,訊息佇列(英語:Message queue)是一種程序間通訊或同一程序的不同執行緒間的通訊方式,軟體的貯列用來處理一系列的輸入,通常是來自使用者。訊息佇列提供了非同步的通訊協議,每一個貯列中的紀錄包含詳細說明的資料,包含發生的時間,輸入裝置的種類,以及特定的輸入引數,也就是說:訊息的傳送者和接收者不需要同時與訊息佇列互動。訊息會儲存在佇列中,直到接收者取回它。

二、實現

實際上,訊息佇列常常儲存在連結串列結構中。[2]擁有許可權的程序可以向訊息佇列中寫入或讀取訊息。
目前,有很多訊息佇列有很多開源的實現,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ[3]、IBM MQ[4]、Apache Qpid[5]和HTTPSQS。[6]

三、優缺點

訊息佇列本身是非同步的,它允許接收者在訊息傳送很長時間後再取回訊息,這和大多數通訊協議是不同的。例如WWW中使用的HTTP協議(HTTP/2之前)是同步的,因為客戶端在發出請求後必須等待伺服器迴應。然而,很多情況下我們需要非同步的通訊協議。比如,一個程序通知另一個程序發生了一個事件,但不需要等待迴應。

但訊息佇列的非同步特點,也造成了一個缺點,就是接收者必須輪詢訊息佇列,才能收到最近的訊息。
和訊號相比,訊息佇列能夠傳遞更多的資訊。與管道相比,訊息佇列提供了有格式的資料,這可以減少開發人員的工作量。[2]但訊息佇列仍然有大小限制。

訊息佇列除了可以當不同執行緒或程序間的緩衝外,更可以透過訊息隊列當前訊息數量來偵測接收執行緒或程序效能是否有問題。

四、如何選擇

關於常見的訊息佇列介紹,在這邊有一個博文寫的非常好了,感興趣的同學可以前往學習研究。
訊息佇列及常見訊息佇列介紹

因為訊息佇列主要是由伺服器端工程師來主導,後端又以Java程式設計師的較多,個人比較推薦的是RabbitMQ和RocketMQ。
如果要在這兩個中進行繼續選擇的話,我個人會選擇RocketMQ,因為阿里在技術這一塊確實做的很優秀,RocketMQ這個阿里雲也有商用版的訊息佇列,你既可以直接用阿里雲上的訊息佇列,也可使用阿里雲開源的RocketMQ技術。
所以說,學起來非常好!

五、訊息佇列的使用場景是怎樣的?

在知乎有一些優秀的討論,感興趣的同學可以去逛一逛咯。
使用場景
個人認為訊息佇列的主要特點是非同步處理,主要目的是減少請求響應時間和解耦。所以主要的使用場景就是將比較耗時而且不需要即時(同步)返回結果的操作作為訊息放入訊息佇列。同時由於使用了訊息佇列,只要保證訊息格式不變,訊息的傳送方和接收方並不需要彼此聯絡,也不需要受對方的影響,即解耦和。

六、並行執行和順序依賴之間怎麼處理?

這是一個經常會遇到的問題,在這個專欄文件裡都有很好的講解
並行執行和順序依賴的藝術

好了,今天就談這麼多了,下面進行專案使用!