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

一個 WIMP 環境像是 Microsoft Windows,藉由優先的某些形式(通常是事件的時間或是重要性的順序)來儲存使用者產生的事件到一個 事件貯列 中。系統把每個事件從事件貯列中傳遞給目標的應用程式。

實現

編輯

實際上,訊息佇列常常儲存在鏈結串列結構中。[2]擁有權限的行程可以向訊息佇列中寫入或讀取訊息。

目前,有很多訊息佇列有很多開源的實現,包括JBoss MessagingJORAMApache ActiveMQSun Open Message QueueRabbitMQ[3]IBM MQ[4]Apache Qpid[5]Apache RocketMQ[6]和HTTPSQS。[7]

優缺點

編輯

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

訊號相比,訊息佇列能夠傳遞更多的資訊。與管道相比,訊息佇列提供了有格式的資料,這可以減少開發人員的工作量。[2]但訊息佇列仍然有大小限制。

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

參考資料

編輯
  1. ^ Sean A. Walberg. 使用UNIX System V IPC机制共享应用程序数据. IBM. 2007-03-15 [2011-01-01]. (原始內容存檔於2019-12-02). 訊息佇列非常獨特,因為兩個行程不必同時存在:一個行程可以傳送一個訊息並退出,而該訊息可以在數天後才被另一個行程獲得。 
  2. ^ 2.0 2.1 鄭彥興. Linux环境进程间通信(三). IBM. 2003-01-17 [2011-01-01]. (原始內容存檔於2019-12-01). 訊息佇列就是一個訊息的鏈結串列。……它提供有格式位元組流,有利於減少開發人員的工作量 
  3. ^ RabbitMQ. [2016-04-14]. (原始內容存檔於2011-03-12). 
  4. ^ IBM MQ. [2016-04-14]. (原始內容存檔於2018-03-07). 
  5. ^ ([//web.archive.org/web/20210310235522/http://qpid.apache.org/ 頁面存檔備份,存於網際網路檔案館) Apache Qpid Project, an implementation of AMQP].
  6. ^ RocketMQ™. [2018-12-26]. (原始內容存檔於2018-12-28). 
  7. ^ HTTPSQS, an message queue based on HTTP GET/POST protocol.. [2010-12-31]. (原始內容存檔於2016-01-09).