消息隊列
在計算機科學中,消息隊列(英語:Message queue)是一種進程間通信或同一進程的不同線程間的通信方式,軟體的貯列用來處理一系列的輸入,通常是來自使用者。消息隊列提供了異步的通信協議,每一個貯列中的紀錄包含詳細說明的資料,包含發生的時間,輸入裝置的種類,以及特定的輸入參數,也就是說:消息的發送者和接收者不需要同時與消息隊列交互。消息會保存在隊列中,直到接收者取回它。[1]
一個 WIMP 環境像是 Microsoft Windows,藉由優先的某些形式(通常是事件的時間或是重要性的順序)來儲存使用者產生的事件到一個 事件貯列 中。系統把每個事件從事件貯列中傳遞給目標的應用程式。
實現
實際上,消息隊列常常保存在鍊表結構中。[2]擁有權限的進程可以向消息隊列中寫入或讀取消息。
目前,有很多消息隊列有很多開源的實現,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ[3]、IBM MQ[4]、Apache Qpid[5]、Apache RocketMQ[6]和HTTPSQS。[7]
優缺點
消息隊列本身是異步的,它允許接收者在消息發送很長時間後再取回消息,這和大多數通信協議是不同的。例如WWW中使用的HTTP協議(HTTP/2之前)是同步的,因為客戶端在發出請求後必須等待服務器回應。然而,很多情況下我們需要異步的通信協議。比如,一個進程通知另一個進程發生了一個事件,但不需要等待回應。但消息隊列的異步特點,也造成了一個缺點,就是接收者必須輪詢消息隊列,才能收到最近的消息。
和信號相比,消息隊列能夠傳遞更多的信息。與管道相比,消息隊列提供了有格式的數據,這可以減少開發人員的工作量。[2]但消息隊列仍然有大小限制。
參考資料
- ^ Sean A. Walberg. 使用UNIX System V IPC机制共享应用程序数据. IBM. 2007-03-15 [2011-01-01]. (原始內容存檔於2019-12-02).
消息隊列非常獨特,因為兩個進程不必同時存在:一個進程可以發送一個消息並退出,而該消息可以在數天後才被另一個進程獲得。
- ^ 2.0 2.1 鄭彥興. Linux环境进程间通信(三). IBM. 2003-01-17 [2011-01-01]. (原始內容存檔於2019-12-01).
消息隊列就是一個消息的鍊表。……它提供有格式字節流,有利於減少開發人員的工作量
- ^ RabbitMQ. [2016-04-14]. (原始內容存檔於2011-03-12).
- ^ IBM MQ. [2016-04-14]. (原始內容存檔於2018-03-07).
- ^ ([//web.archive.org/web/20210310235522/http://qpid.apache.org/ 頁面存檔備份,存於網際網路檔案館) Apache Qpid Project, an implementation of AMQP].
- ^ RocketMQ™. [2018-12-26]. (原始內容存檔於2018-12-28).
- ^ HTTPSQS, an message queue based on HTTP GET/POST protocol.. [2010-12-31]. (原始內容存檔於2016-01-09).