RabbitMQ概念 AMQP模型

引言:

        AMQP全称是Advanced Message Queuing Protocol,它是一个(分布式)消息传递协议,使用和符合此协议的客户端能够基于使用和符合此协议的消息传递中间件代理, RabbitMQ实现的AMQP版本是0.9.1 AMQP 0-9-1协议,这是RabbitMQ支持的协议之一,是一种消息传递协议同时,AMQP 0-9-1是一个可编程协议。 理解AMQP 0-9-1协议,有助于理解RabbitMQ实现原理

文章列表

1-RabbitMQ Server简介和安装教程

2-RabbitMQ概念 AMQP模型

3-RabbitMQ教程第一步Hello World

4-RabbitMQ教程工作队列Work queues

5-RabbitMQ教程扇出交换器和发布订阅

6-RabbitMQ教程直连交换器和路由Routing

7-RabbitMQ教程主题交换器Topics

8-RabbitMQ教程远程过程调用RPC

9-RabbitMQ教程发布确认PublishConfirm

AMQP 0-9-1模型图

AMQP 0-9-1协议定义的模型如下图所示,消息被发布给Excharges ,Excharge 通常比做邮局或者邮箱,Excharge通过规则将消息副本发送给队列,代理然后将消息传递给订阅队列的消费者,或者消费者主动从队列中提取消息,

发布者在发布消息的时候可以指定消息属性(消息元数据),某些消息元数据可能由消息中间件代理使用,其他消息元数据对于消息中间件代理而言是不透明的,仅供消息消费者使用。

由于网络是不可靠的,客户端可能无法接收消息或者处理消息失败,这个时候消息中间件代理无法感知消息是否正确传递到消费者中,因此AMQP模型提供了消息确认(Message Acknowledgement)的概念:当消息传递到消费者,消费者可以自动向消息中间件代理确认消息已经接收成功或者由应用程序开发者选择手动确认消息已经接收成功并且向消息中间件代理确认消息,消息中间件代理只有在接收到该消息(或者消息组)的确认通知后才会从队列中完全删除该消息。

在某些情况下,交换器无法正确路由到队列中,那么该消息就会返回给发布者,或者丢弃,或者如果消息中间件代理实现了"死信队列(Dead Letter Queue)"扩展,消息会被放置到死信队列中。消息发布者可以选择使用对应的参数控制路由失败的处理策略。

AMQP 0-9-1模型概念

Exchanges (交换器)

Exchange 是接收消息的实体,它接收消息然后将其路由到0个或者多个队列中,路由的算法取决于exchange type 和具体路由规则,RabbitMQ消息中间件代理支持四种类型的交互器

交换器类型

声明方式

Direct exchange

(直连交换器)

(Empty string) and amq.direct

Routing Key==Binding Key

将消息发送给routing key匹配的队列

Fanout exchange

(扇出交换器)

amq.fanout

Routing Key==Binding Key

将消息发送给所有绑定的队列

Topic exchange

(主题交换器)

amq.topic

将消息发送给routing key匹配的队列

Headers exchange (头部交换器)

amq.match (and amq.headers in RabbitMQ)

Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。

除了交换器类型以外还需要声明其他属性,例如:名称,持久性,是否删除,参数等

Direct exchange 直连交换器

直连交换器是一种基于路由秘钥(routing key)将消息发送给队列的交换器,他的工作方式很简单,一个队列使用秘钥为K 绑定交换器直连交换器收到一条路由秘钥是R的消息,当R=K的时候,此消息放入队列中,直连交换器通常用于以循环方式在多个工作人员之间分配任务,值得注意的是AMQP 0-9-1模型中消息是在消费者之间实现负载均衡并不是在队列之间实现负载均衡

Default Exchange默认交换器

默认交换器是一种特殊的直连交换器,它的名称是空字符串(也就是""),它由消息中间件代理预声明,创建的每个队列都自动用一个与队列名相同的路由键秘钥绑定到默认交换器,所有的队列都可以通过默认交换器进行消息投递,只需要指定路由键为相应的队列名即可,这样就看起来消息直接传递给了队列

Fanout Exchange 扇出交换器

扇出交换器处理时会忽略消息秘钥,将消息发送给绑定它的所有队列,例如N个队列绑定一个扇出交换器,扇出交换器收到消息后会将消息副本传递给N个队列,扇出交换器是消息广播路由的理想选择

因为扇出交换将消息的副本传递给绑定到它的每个队列,所以使用非常广泛

  • 大型多人在线(MMO)游戏可以将其用于排行榜更新或其他全球活动
  • 体育新闻网站可以使用扇出交换向移动客户端近乎实时地分发分数更新
  • 分布式系统可以广播各种状态和配置更新
  • 群聊可以使用扇出交换在参与者之间分发消息(尽管AMQP没有内置的在线概念,因此XMPP可能是更好的选择)

 

Topic exchange 主题交换器

主题交换基于配对匹配的消息路由键,将消息路由到一个或多个队列。绑定队列和交换器的Topic模式(这个模式串其实就是声明绑定时候的路由键和消息发布的路由键并非同一个)一般使用点号(dot,也就是'.')分隔,例如source.target.key,绑定模式支持通配符:

  • 符号'#'匹配一个或者多个词,例如:source.target.#可以匹配source.target.doge、source.target.doge.throwable等等。
  • 符号'*'只能匹配一个词,例如:source.target.*可以匹配source.target.doge、source.target.throwable等等。

对每一条消息,Topic交换器会遍历所有的绑定关系,检查消息指定的路由键是否匹配绑定关系中的路由键,如果匹配,则将消息推送到相应队列。

主题交换类型通常用于实现各种发布/订阅模式变体。主题交换通常用于消息的多播路由。主题交换有非常广泛的用例集。当一个问题涉及多个消费者/应用程序,这些消费者/应用程序选择性地选择他们想要接收的消息类型时,应该考虑使用主题交换。

示例用途:

  • 分发与特定地理位置相关的数据,例如销售点
  • 由多个工作人员完成的后台任务处理,每个工作人员都能够处理特定的任务集
  • 股票价格更新(以及其他类型财务数据的更新)
  • 涉及分类或标记的新闻更新(例如,仅针对特定运动或团队)
  • 云中不同类型服务的编排
  • 分布式架构/操作系统特定的软件构建或打包,其中每个构建者只能处理一个架构或操作系统

Headers exchange 头部交换器

交换器不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。

匹配规则x-match有下列两种类型:

x-match = all :表示所有的键值对都匹配才能接受到消息

x-match = any :表示只要有键值对匹配就能接受到消息

Queues

队列用于储存消息,声明队列时如果队列不存在则会创建队列, 如果队列存在且其他属性也相同则声明无效,如果队列存在且其他属性不同将会提示错误码 406(PRECONDITION_FAILED)

  • 队列名称最多是可包含255字节的UTF-8字符,
  • 以“amq”开头的队列名是保留使用的名称,队列可以被声明为持久的或短暂的。持久队列的元数据存储在磁盘上,而临时队列的元数据存储在内存中

参考官网:https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-default

上一篇:RabbitMQ Server简介和Windows安装使用

猜你喜欢

转载自blog.csdn.net/Beijing_L/article/details/119181812