Java 杂谈

消息队列协议(一)---AMQP

2019-05-18  本文已影响0人  Coding小聪

1. 概述

AMQP全称为Advanced Message Queuing Protocol,即高级的消息队列协议,它主要应用于消息中间件。在市面上主流的MQ产品(ActiveMQ、RocketMQ、Kafka、RabbitMQ)当中,对AMQP协议支持较好的产品是RabbitMQ。

AMQP协议有以下版本

这篇文章我们基于0-9-1版本进行分析,之所以选择这个版本是因为RabbitMQ支持的AMQP版本就是0-9-1。

2. 组件

3. 分层描述

3.1 服务端分层

AMQP协议是分层描述的,在0-9-1版本中(不同版本中的分层有所不同),分了两层:Functional Layer和Transport Layer,即功能层和传输层。

AMQP服务端分层

功能层定义了一系列命令,客户端应用可以使用它们来实现自己的业务逻辑。这些命令按功能逻辑组合形成不同的Class类,即使用API类来表示命令。

传输层将功能层所接收的消息传递给服务器经过相应处理后再返回,处理的事情包括信道复用、内容编码、心跳检测、错处处理等。

3.2 客户端分层

AMQP客户端分层

API层:该层会暴露特定的API给应用程序调用;
Connection管理层:连接管理;
异步I/O层:主要用于网络IO通讯。

4. 交换器Exchange

交换器用来接收生产者投递过来的消息,然后在将消息转发到消息队列当中。根据交换器的类型不同,交换器转发的规则也有所不同。目前,AMQP提供了4种类型的交换器:direct,fanout,topic,header.

(1)direct类型

该类型的交换器在分发消息到指定队列时要求:生产者生产某条消息时指定的路由关键字X与队列绑定到交换器上时指定的路由关键字Y完全一致,即X = Y。

而且,多个队列可以使用相同的路由关键字与交换器绑定。比如,生产者不断的生成路由关键字为X的消息,你可以指定多个队列都使用路由关键字Y与该交换器绑定(X=Y)。这样一来,消息就会被分发至多个队列中。但是,需要注意的是,消息负载均衡并不在于队列间,而是在于消费者间。

direct

(2)fanout类型

该类型的交换器会将消息转发给所有与之绑定的队列上。比如,有N个队列与fanout交换器绑定,当产生一条消息时,交换器会将该消息的N个副本分别发给每个队列。类似于广播机制。


fanout

Fanout Exchange 会忽略 RoutingKey 的设置,直接将 Message 广播到所有绑定的 Queue 中。

(3)topic类型

该类型的交换器会视消息路由关键字和绑定路由关键字之间的匹配情况,进行消息的路由转发。比如,消息路由关键字为x.y.z的消息会转发给绑定路由关键字为.y.的队列,也会转发给绑定路由关键字为x.#的队列,但却不会转发给绑定路由关键字为.a.的队列。

topic

Topic Exchange 和 Direct Exchange 类似,也需要通过 RoutingKey 来路由消息,区别在于Direct Exchange 对 RoutingKey 是精确匹配,而 Topic Exchange 支持模糊匹配。分别支持和#通配符,表示匹配一个单词,#则表示匹配没有或者多个单词。

(4)headers类型

该类型的交换器与前面介绍的稍有不同,它不再是基于路由关键字(routing key)进行路由,而是基于多个属性进行路由的,这些属性比路由关键字更容易表示为消息的头。也就是说,用于路由的属性是取自于消息header属性的,当消息header的值与队列绑定时指定的值相同时,消息就会路由至相应的队列中。

参考

  1. http://www.amqp.org/specification/0-9-1/amqp-org-download
  2. RabbitMQ Tutorials
上一篇 下一篇

猜你喜欢

热点阅读