消息队列简介

 

 

一、概述

计算机科学中,消息队列和邮箱是用于进程间或者线程与同一进行间通讯的软件工程组件。他们都是消息传传输控制队列。

消息队列是发布/订阅模型的变种,是较大的面向消息的中间件的一部分。多数消息系统支持发布/订阅和消息队列模型的API,如JMS(Java Message Service)。

消息队列提供异步的通讯协议,这就意味着消息发送者和消息接收者不需要在同一时间与消息队列交互。消息入队直到接收者来读取。消息队列都有单条消息大小的限制,入队消息的数目也有限制。

消息队列的主要应用是在不同计算机系统间进行通讯,可以连接多个应用和多种操作系统。有时消息队列增加了一种增强功能,确认在系统失效时不丢失消息。

多数实时操作系统,如VxWorks和QNX,鼓励使用消息队列作进行间或者线程间主要的通讯机制。Erlang语言使用进程,提供同样的功能。这些进程使用消息队列进行异步通讯。

二、用例

在一个典型的消息队列应用场景中,系统管理员安装和配置消息队列软件,并命名消息队列或者注册消息服务。应用程序的进程注册并监听消息。接下的应用连接到队列,并在此之上传送消息。

消息队列管理软件保存消息直到接收程序连接到队列。接收程序接收并处理消息。

有多种消息处理模块:

1、持久存储。消息保存在内容,并写到磁盘中,甚至写入数据库;

2、安全策略。控制哪个程序才能访问队列;

3、消息存活策略。队列和消息存在一个有效期;

4、消息过滤。支持消息路由,只接收选择的数据;

5、送达策略。至少一次或者其他;

6、路由策略。在多服务系统,那个服务应该接收到消息;

7、批处理策略。消息是立即投递或者稍等一会一块投递;

8、入队条件。什么时候才能称已经入队;

9、接收通知。消息发布者可能需要消息订阅是否已经接收到消息。

三、标准和协议

历史上,消息队列曾用私有的、封闭的协议,这就限制了不同操作系统或者不同编程语言在一个异构的环境中进行通讯。

早期通用化尝试为SUN公司的JMS,他只提供Java语言API的客户端。这就给Java开发人员提供了一种类型数据库开发人员使用的SQL语言。在实际应用中,考虑到消息队列的差异及应用场景的不同,很难做到通用。

在开源消息队列的实现过程中,逐渐形成了3种标准:

1、AMQP富特征消息队列;

2、STOMP,简单的面向文件的消息队列;

3、MQTT,轻量级的消息队列。

这些协议标准程序和接收程序不同。AMQP和STOMP和HTTP位于同一层。MQTT与TCP处于同一层。

一些私有化实现,也采用HTTP来提供消息队列,如Amazon的SQS。因为总存在一种使用基于请求应答机制实现通过异步协议增加异步功能的可能性。

四、同步VS异步

多数广泛使用的通讯协议,操作是同步,如应用于万维网和Web服务中的HTTP协议。HTTP的典型场景是:客户端发送一个请求,接着等待回应。

但是与存在一些场景同步操作并不适合。例如AJAX(Asynchronos JavaScript ans XML)用于异步传送文件、JSON和XML消息,以此来更新部分网页。Google用AJAX技术实现了Google Suggest,用于传送部分已经匹配客户查询信息列表,这个列表异步更新。

其他异步用例存在于事件通知系统和发部/订阅系统中:

1、一个应用可能需要通讯其他应用一个事件的发生,但不需要等待回应;

2、在发部/订阅系统中,一个应用发部信息给多个客户端去读。

上述两个例都没有必要等待响应,就算一个接收宕掉。

应用不需要只异步或者同步。一个应用可以部分功能使用异步方式,部分功能使用同步方式。

posted @ 2017-11-04 17:26  旺旺Ever  阅读(386)  评论(0编辑  收藏  举报