5.RabbitMQ 的工作原理(重要)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 5.RabbitMQ 的工作原理(重要)

工作原理:

RabbitMQ 有 4 个组件:生产者、Exchange、queue 队列、消费者。当生产者发出一条消息时,先经过 Exchange,由 Exchange 转发给队列,然后由消费者进行消费。

 

系统架构

Rabbitmq 系统最核心的组件是 Exchange 和 Queue,下图是系统简单的示意图。Exchange 和 Queue 是在服务(又叫做 broker)端,producer 和 consumer 在应用端。

producer&Consumer

producer 指的是消息生产者,consumer 消息的消费者。

Queue

消息队列,提供了 FIFO 的处理机制,具有缓存消息的能力。rabbitmq 中,队列消息可以设置为持久化,临时或者自动删除。

  1. 设置为持久化的队列,queue 中的消息会在 server 本地硬盘存储一份,防止系统 crash,数据丢失
  2. 设置为临时队列,queue 中的数据在系统重启之后就会丢失
  3. 设置为自动删除的队列,当不存在用户连接到 server,队列中的数据会被自动删除

Exchange

Exchange 类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq 中,producer 不是通过信道直接将消息发送给 queue,而是先发送给 Exchange。一个 Exchange 可以和多个 Queue 进行绑定,producer 在传递消息的时候,会传递一个 ROUTING_KEY,Exchange 会根据这个 ROUTING_KEY 按照特定的路由算法,将消息路由转发给匹配的 queue。和 Queue 一样,Exchange 也可设置为持久化,临时或者自动删除。

Exchange 有 4 种类型:direct (默认),fanout, topic, 和 headers,不同类型的 Exchange 转发消息的策略有所区别:

  1. Direct
    直接交换器,工作方式类似于单播,Exchange 会将消息发送完全匹配 ROUTING_KEY 的 Queue
  2. fanout
    广播式交换器,不管消息的 ROUTING_KEY 设置为什么,Exchange 都会将消息转发给所有绑定的 Queue。
  3. topic
    主题交换器,工作方式类似于组播,Exchange 会将消息转发和 ROUTING_KEY 匹配模式相同的所有队列,比如,ROUTING_KEY 为 user.stock 的 Message 会转发给绑定匹配模式为 * .stock,user.stock, * . * 和 #.user.stock.# 的队列。( * 表是匹配一个任意词组,# 表示匹配 0 个或多个词组)
  4. headers
    消息体的 header 匹配(几乎不用,可以忽视)

Binding

所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和 Queue 的绑定可以是多对多的关系。

virtual host

在 rabbitmq server 上可以创建多个虚拟的 message broker,又叫做 virtual hosts (vhosts)。每一个 vhost 本质上是一个 mini-rabbitmq server,分别管理各自的 exchange,和 bindings。vhost 相当于物理的 server,可以为不同 app 提供边界隔离,使得应用安全的运行在不同的 vhost 实例上,相互之间不会干扰。producer 和 consumer 连接 rabbit server 需要指定一个 vhost。

通信过程

假设 P1 和 C1 注册了相同的 Broker,Exchange 和 Queue。P1 发送的消息最终会被 C1 消费。基本的通信流程大概如下所示:

  1. P1 生产消息,发送给服务器端的 Exchange
  2. Exchange 收到消息,根据 ROUTINKEY,将消息转发给匹配的 Queue1
  3. Queue1 收到消息,将消息发送给订阅者 C1
  4. C1 收到消息,发送 ACK 给队列确认收到消息
  5. Queue1 收到 ACK,删除队列中缓存的此条消息

Consumer 收到消息时需要显式的向 rabbit broker 发送 basic.ack 消息或者 consumer 订阅消息时设置 auto_ack 参数为 true。在通信过程中,队列对 ACK 的处理有以下几种情况:

  1. 如果 consumer 接收了消息,发送 ack,rabbitmq 会删除队列中这个消息,发送另一条消息给 consumer。
  2. 如果 cosumer 接受了消息,但在发送 ack 之前断开连接,rabbitmq 会认为这条消息没有被 deliver(交付), 在 consumer 在次连接的时候,这条消息会被 redeliver。
  3. 如果 consumer 接受了消息,但是程序中有 bug, 忘记了 ack,rabbitmq 不会重复发送消息。
  4. rabbitmq2.0.0 和之后的版本支持 consumer reject 某条(类)消息,可以通过设置 requeue 参数中的 reject 为 true 达到目地,那么 rabbitmq 将会把消息发送给下一个注册的 consumer。
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
10天前
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
3月前
|
消息中间件 存储 数据库
深入学习RocketMQ的底层存储设计原理
文章深入探讨了RocketMQ的底层存储设计原理,分析了其如何通过将数据和索引映射到内存、异步刷新磁盘以及消息内容的混合存储来实现高性能的读写操作,从而保证了RocketMQ作为一款低延迟消息队列的读写性能。
|
22天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
3月前
|
消息中间件 负载均衡 API
RocketMQ生产者负载均衡(轮询机制)核心原理
文章深入分析了RocketMQ生产者的负载均衡机制,特别是轮询机制的实现原理,揭示了如何通过`ThreadLocal`技术和消息队列的选播策略来确保消息在多个队列之间均衡发送,以及如何通过灵活的API支持自定义负载均衡策略。
|
3月前
|
消息中间件 存储 负载均衡
RocketMQ消费者消费消息核心原理(含长轮询机制)
这篇文章深入探讨了Apache RocketMQ消息队列中消费者消费消息的核心原理,特别是长轮询机制。文章从消费者和Broker的交互流程出发,详细分析了Push和Pull两种消费模式的内部实现,以及它们是如何通过长轮询机制来优化消息消费的效率。文章还对RocketMQ的消费者启动流程、消息拉取请求的发起、Broker端处理消息拉取请求的流程进行了深入的源码分析,并总结了RocketMQ在设计上的优点,如单一职责化和线程池的使用等。
RocketMQ消费者消费消息核心原理(含长轮询机制)
|
3月前
|
消息中间件 存储 RocketMQ
2分钟看懂RocketMQ延迟消息核心原理
本文从源码层面解析了RocketMQ延迟消息的实现原理,包括延迟消息的使用、Broker端处理机制以及定时任务对延迟消息的处理流程。
2分钟看懂RocketMQ延迟消息核心原理
|
3月前
|
消息中间件 存储 缓存
RocketMQ发送消息原理(含事务消息)
本文深入探讨了RocketMQ发送消息的原理,包括生产者端的发送流程、Broker端接收和处理消息的流程,以及事务消息的特殊处理机制,提供了对RocketMQ消息发送机制全面的理解。
RocketMQ发送消息原理(含事务消息)
|
4月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
4月前
|
消息中间件 存储 缓存
MetaQ/RocketMQ 原理问题之Consume queue中的条目长度是固定的问题如何解决
MetaQ/RocketMQ 原理问题之Consume queue中的条目长度是固定的问题如何解决
|
4月前
|
消息中间件 存储 索引
MetaQ/RocketMQ 原理问题之Consumer在MetaQ中工作的问题如何解决
MetaQ/RocketMQ 原理问题之Consumer在MetaQ中工作的问题如何解决
下一篇
无影云桌面