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