消息队列
在计算机科学中,消息队列(英語: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).