消息队列

电脑科学中,消息队列(英语: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).