之前我们的分布式消息队列使用的是RabbitMQ,但仅限于使用它,但是对于它的内部机制的细节没有太多的认知,偶然从某公众号文章中看到RabbitMQ系列的详解,并且比较通俗易懂,所以拿过来分享一下。

简介

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个基于应用层的异步消息服务协议,为面向消息的中间件设计提供了统一实现规范。AMQP 协议的目标是实现一种在全行业内广泛使用的标准消息中间件,解决众多消息队列供应商接口不统一的问题。RabbitMQ 就是使用 Erlang 编程语言开发的一个 AMQP 开源实现,是目前为止部署最广泛的开源消息代理和消息队列中间件。作为一个企业级消息系统,RabbitMQ 支持多种编程语言和客户端,并且自带了集群、管理、插件等功能,拥有着良好的高可用性、可扩展性和易用性。

安装 RabbitMQ

RabbitMQ 提供了详尽的安装文档步骤,我们可以根据不同的操作系统类型来进行选择。
以 Ubuntu 为例,执行安装指令:

sudo apt-get install -yq rabbitmq-server 

启动 rabbitmq-server:

sudo service rabbitmq-server start

查看 Queues 列表:

sudo rabbitmqctl list_queues

基本对象概念

在学习 RabbitMQ 的实际操作之前,首先需要掌握下列 RabbitMQ 的基本对象概念。

https://mp.weixin.qq.com/s?__biz=MzI3MDM0NjU3MA==&mid=2247483958&idx=1&sn=226ae78dae87906eed7056579b24c7b6&chksm=ead33213dda4bb05a3496a76f8e279074c33fb4d02515a5e9c974c2c9068902fc02256fb3998&scene=21#wechat_redirect

Tips:结合图文浏览,有助于理解!!

Message 消息

是 RabbitMQ 的操作单元,由 Payload 有效负载和 Label 标签两部分组成,前者作为消息的主体数据,后者则包含了消息路由转发相关的描述数据。

Producer 生产者

负责生产消息,通过设定 Label 的内容来决定将消息投递到指定队列。

Consumer 消费者

负责接收消息并执行相应的任务,消费者仅仅会关心消息的 Payload,而无需关心消息的 Label。消费者会从订阅的队列中获取消息,如果有多个消费者订阅了同一队列,那么队列默认会以平摊的方式将消息分派给消费者。

Queue 队列

是存放消息的地方,消息会在队列中以 FIFO 的方式等待取出。

Exchange 交换机

生产者和队列之间的中转站,充当路由器的功能,将消息路由到不同的队列中,最后再被订阅了该队列的消费者取出。

Binding 绑定

为队列和交换机建立绑定关系,只有在确立了绑定关系之后,交换机才会将消息路由到相应的队列中,每一个绑定关系都会包含有一个 Binding Key。

Binding Key 绑定键

在绑定交换机和队列时,会为此次绑定设置一个 Key 值,作为唯一标识。

Routing Key 路由键

消息的路由转发描述,用作消息和队列之间的匹配,会在队列绑定到交换机时设置。同时,生产者在生产消息时也为该消息指定一个路由键,以此来决定由将该消息存放到哪一个队列中。实际上 Routing Key 可能还需要结合 Exchange Type 以及 Binding Key 才能最终决定路由目标。

Exchange Type 交换机类型

RabbitMQ 支持 fanout、direct、topic、headers 四种交换机类型,每种类型都具有特定的消息路由策略。

  • fanout exchange 扇形交换机:该类型交换机会无视路由键,将同一份消息路由给绑定到扇形交换机自身的所有队列,所以扇形交换机采用的是广播路由策略。也就是说同一份消息会被分发给不同的消费者,进而执行不同的任务。这一特性,非常符合「单一操作,多重响应」的场景,例如:Blog 系统中的一个新建博文操作,实际上需要完成新建博文记录、更新文章计数、推送订阅邮件等多种响应。

  • direct exchange 直连交换机:当队列绑定到交换机之后,会为此次绑定设置一个路由键。生产者将消息发送到交换机之前,也会为消息设置一个路由键,直连交换机会通过匹配消息路由键与绑定路由键来确定消息路由目标。所以直连交换机采用的是单播路由策略。

  • topic 主题交换机:在交换机与队列建立绑定时,除了会设置路由键之外还会设置一个绑定键,而且绑定键支持通配符 *(单个字符) 和 #(任意个字符)两种形式。主题交换机会通过匹配消息路由键和绑定键来确定消息路由目标,也就是说同一个队列能够接收不同路由键的消息(绑定键具有通配符),所以主题交换机是一种多播路由策略。需要注意的是,应用主题交换机时,消息的路由键命名格式应该是以 ’.’ 分割的单词词组。例如:路由键分别为 task.add、task.sub、task.mult 的消息都会路由到绑定键为 ‘task.#’ 的队列中。

  • headers 头交换机:头交换机不会依赖路由键和绑定键作为路由策略因素,而是单纯的通过消息中所包含的 AMQP 协议头信息来决定,该类型交换机因为效率问题,一般很少被用

下一篇:

快速入门分布式消息队列之 RabbitMQ(中)

原文转自:https://mp.weixin.qq.com/s?__biz=MzI3MDM0NjU3MA==&mid=2247483958&idx=1&sn=226ae78dae87906eed7056579b24c7b6&chksm=ead33213dda4bb05a3496a76f8e279074c33fb4d02515a5e9c974c2c9068902fc02256fb3998&scene=21#wechat_redirect