RabbitMQ发布确认及交换机类型

RabbitMQ发布确认机制详解

一、引言

在消息队列(MQ)技术中,RabbitMQ因其稳定性、可靠性和易用性而受到广泛欢迎。为了确保消息的可靠传递,RabbitMQ提供了一系列高级特性,其中发布确认(Publisher Confirms)机制就是其中之一。本文将深入探讨RabbitMQ的发布确认机制,以及它如何在消息发布过程中发挥作用。

二、发布确认机制概述

RabbitMQ的发布确认机制是一种增强消息发布可靠性的方法。当生产者(Producer)启用发布确认功能后,每次发送消息到RabbitMQ时,都会获得一个唯一的序列号(delivery tag),并从1开始递增。一旦消息被成功路由到至少一个匹配的队列,并且满足持久化条件(如果已配置),RabbitMQ会向生产者发送一个包含已确认消息序列号的basic.ack消息。

三、发布确认的三种模式

单条发布确认

  • 在发布一条消息后,生产者等待RabbitMQ的确认。
  • 缺点是每条消息都需要等待确认,可能导致性能开销较大,特别是在高并发场景下。

批量发布确认

  • 生产者可以一次发送多条消息,然后等待RabbitMQ的批量确认。
  • 当一批消息中有一条发送失败时,整个批量确认会失败,可能需要重新发送整批消息,且不容易定位到具体哪条消息失败。

异步发布确认

  • 生产者不直接等待每条消息的确认,而是通过回调函数或其他机制异步处理确认消息。
  • 这种模式可以提高性能,但也需要更复杂的编程逻辑来确保消息的可靠性。

四、如何启用发布确认

启用发布确认功能相对简单。生产者需要先将信道设置为确认模式,通过Channel.confirmSelect()方法来激活该功能。此后,发送的每条消息都将获得一个序列号,并等待RabbitMQ的确认。

RabbitMQ交换机类型详解

RabbitMQ作为一款广泛使用的开源消息队列软件,其强大的路由功能得益于其灵活的交换机(Exchange)类型。交换机在RabbitMQ中扮演着将消息路由到正确队列的关键角色。本文将详细介绍RabbitMQ中的四种主要交换机类型:Fanout、Direct和Topic。

一、Fanout交换机

Fanout交换机,也被称为广播交换机,是RabbitMQ中最简单的交换机类型。当消息发送到Fanout交换机时,它会将消息广播到所有绑定到该交换机的队列中。这种交换机不考虑消息的路由键(Routing Key),因此消息传递的速度非常快。

二、Direct交换机

Direct交换机是一种带路由功能的交换机。它根据消息的路由键将消息路由到具有相同绑定键(Binding Key)的队列中。这意味着消息的路由键必须与队列的绑定键完全匹配,消息才会被路由到该队列。

在上面这张图中,我们可以看到 X 绑定了两个队列,绑定类型是 direct。队列 Q1 绑定键为 orange,队列 Q2 绑定键有两个:一个绑定键为 black,另一个绑定键为 green. 在这种绑定情况下,生产者发布消息到 exchange 上,绑定键为 orange 的消息会被发布到队列Q1。绑定键为 blackgreen 和的消息会被发布到队列 Q2,其他消息类型的消息将被丢弃。

三、Topic交换机

Topic交换机在Direct交换机的基础上增加了模式匹配功能。它使用路由键中的点分隔符来支持更灵活的匹配规则。在Topic交换机中,可以使用"*"来匹配一个单词,使用"#"来匹配零个或多个单词。
下图绑定关系如下
Q1--> 绑定的是中间带 orange 带 3 个单词的字符串 (*.orange.*)
Q2--> 绑定的是最后一个单词是 rabbit 的 3 个单词 (*.*.rabbit)第一个单词是 lazy 的多个单词 (lazy.#)


上图是一个队列绑定关系图,我们来看看他们之间数据接收情况是怎么样的
quick.orange.rabbit 被队列 Q1Q2 接收到
lazy.orange.elephant 被队列 Q1Q2 接收到
quick.orange.fox 被队列 Q1 接收到
lazy.brown.fox 被队列 Q2 接收到
lazy.pink.rabbit 虽然满足两个绑定但只被队列 Q2 接收一次
quick.brown.fox 不匹配任何绑定不会被任何队列接收到会被丢弃
quick.orange.male.rabbit 是四个单词不匹配任何绑定会被丢弃
lazy.orange.male.rabbit 是四个单词但匹配 Q2

相关推荐
来一杯龙舌兰3 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
Allen Bright12 小时前
Spring Boot 整合 RabbitMQ:从入门到实践
spring boot·rabbitmq·java-rabbitmq
bug_null1 天前
RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
分布式·rabbitmq
kingbal1 天前
RabbitMQ:添加virtualHost
分布式·rabbitmq
04Koi.1 天前
Java项目--仿RabbitMQ的消息队列--虚拟主机设计
分布式·rabbitmq
04Koi.1 天前
Java项目--仿RabbitMQ的消息队列--网络通信协议设计
分布式·rabbitmq
大饼酥1 天前
保姆级教程Docker部署RabbitMQ镜像
docker·容器·rabbitmq
Code apprenticeship1 天前
RabbitMQ如何实现延时队列?
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--消息持久化
分布式·rabbitmq
一名技术极客2 天前
RabbitMQ实现网络分区
网络·分布式·rabbitmq