springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq,并且项目已经引入rabbitmq,完成了配置。

不同模式所需参数不同,生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。

不同的交换机是实现不同工作模式的关键组件.每种交换机类型都有其特定的路由和分发策略。

一些概念:

生产者(Producer):负责发布消息到交换机(Exchange)。

交换机(Exchange):根据类型(如Fanout、Direct、Topic)和配置的路由规则将消息路由到一个或多个队列。

队列(Queue):存储消息,直到它们被消费者接收并处理。队列是发布订阅模式中的核心组件,因为消息实际上是被存储在队列中,等待消费者来拉取。

消费者(Consumer):从队列中接收并处理消息。消费者通过订阅队列来接收消息。在RabbitMQ中,消费者实际上是通过声明(或连接到)一个队列来开始接收该队列中的消息的。

一、Simple(简单模式)

这是最基本的模式,包含一个生产者和一个消费者和一个队列bean。生产者发送消息到指定队列,消费者从该队列中接收消息。

如下图:

生产者P往queue发送消息,消费者C消费queue里的消息。

上述关系配置

@Configuration
public class RabbitMqConfig {
    //生产者往队列名为hello的队列发送消息,消费者监听名为hello的队列
   @Bean
    public Queue hello() {
        return new Queue("hello");
    }
}

二、WorkQueue(工作队列模式)

这种模式也包含一个生产者,但是消费者有多个。生产者发送的消息会依次被消费者接收,这种模式常用于处理消息较多的情况。

如下图:

生产者P往queue发送消息,消费者C1、C2、C3均消费queue里的消息。

RabbitMQ的消息分发机制会确保消息在队列中的顺序性,并根据消费者的消费能力和策略来进行分发。也就是说一条消息一般情况下只会发送给一个消费者,不会出现三个消费者都消费了同一条消息的情况。

上述关系配置

@Configuration
public class RabbitMqConfig {
    //生产者往队列名为hello的队列发送消息,多个消费者均监听名为hello的队列
   @Bean
    public Queue hello() {
        return new Queue("hello");
    }
}

三、Publish/Subscribe(发布/订阅模式)

在该模式下,交换机一般使用FanoutExchange。不过也可以使用Topic交换机来实现更加复杂的路由策略.

交换机和队列是两个独立的个体,他们的关系是通过配置绑定来完成的,也就意味着他们的关系可以任意搭配,可以一个交换机绑定多个队列,一个队列也可以绑定多个交换机。

在该模式下,生产者发送的消息会被广播到所有与Fanout交换机绑定的队列中。每个队列中的消费者都会从它们自己的队列中拉取并消费消息,但不同的消费者(即使它们连接到同一个队列)也会独立地处理消息,即每个消息只会被一个消费者处理一次(除非设置了手动确认并且消费者没有确认消息,或者连接断开等情况导致消息被重新排队)。

多个队列绑定一个交换机

生产者生产消息,发送到交换机,交换机会将消息转发给绑定的全部队列。也就是广播。

如下图:

X是交换机,Q1、Q2是队列。通过配置将队列绑定到交换机X上。

上述关系配置

@Configuration
public class RabbitMqConfig {

    //生产者发送消息到该交换机,交换机填test.fanout
    @Bean
	public FanoutExchange fanout() {
		return new FanoutExchange("test.fanout");
	}
    
    //消费者订阅该队列,队列填test.queue1
    @Bean
    public Queue autoDeleteQueue1() {
        return new Queue("test.queue1");
    }

    @Bean
    public Queue autoDeleteQueue2() {
        return new Queue("test.queue2");
    }

    //将Q1绑定到fanout交换机上
    @Bean
	public Binding binding1(FanoutExchange fanout,Queue autoDeleteQueue1) {
	    return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
	}

    //将Q2绑定到fanout交换机上
	@Bean
	public Binding binding2(FanoutExchange fanout,Queue autoDeleteQueue2) {
		return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
	}

}

一个队列绑定多个交换机

Q1绑定了X1交换机,同时也绑定了X2交换机。P1生产的消息会转发给Q1,P2生产的消息也会转发给Q1。

上述关系配置

@Configuration
public class RabbitMqConfig {

    //生产者发送消息到该交换机,交换机填test.fanout1
    @Bean
	public FanoutExchange fanout1() {
		return new FanoutExchange("test.fanout1");
	}

     //生产者发送消息到该交换机,交换机填test.fanout2
    @Bean
	public FanoutExchange fanout2() {
		return new FanoutExchange("test.fanout2");
	}
    
    //消费者订阅该队列,队列填test.queue1
    @Bean
    public Queue autoDeleteQueue1() {
        return new Queue("test.queue1");
    }

    //将Q1绑定到fanout1交换机上
    @Bean
	public Binding binding1(FanoutExchange fanout1,Queue autoDeleteQueue1) {
	    return BindingBuilder.bind(autoDeleteQueue1).to(fanout1);
	}

    //将Q1绑定到fanout2交换机上
	@Bean
	public Binding binding2(FanoutExchange fanout2,Queue autoDeleteQueue1) {
		return BindingBuilder.bind(autoDeleteQueue1).to(fanout2);
	}

}

四、Routing(路由模式)

该模式下使用的交换机是直连交换机。在这种模式下,生产者发送消息到交换机时,需要指定一个路由键.

在路由模式下,可以通过绑定将路由键、交换机和队列绑定起来。生产者生产的消息会传入交换机参数和路由键参数,通过交换机参数和路由键参数查找存在的绑定关系(可能存在多个)就可以找到队列并将消息发送到对应的队列。消费者监听队列完成消费。

多个路由键绑定一个队列

如下图:

direct是交换机,orange、black、green是路由键,Q1、Q2是队列。

路由键为orange的消息会被交换机转发到Q1,路由键为black或green的消息会被交换机转发到Q2。

上述关系所需配置

@Configuration
public class RabbitMqConfig {

    //生产者发送消息到该交换机,交换机填test.direct
    @Bean
	public DirectExchange direct() {
		return new DirectExchange("test.direct");
	}
    
    //消费者订阅该队列,队列填test.queue1
    @Bean
    public Queue autoDeleteQueue1() {
        return new Queue("test.queue1");
    }

    @Bean
    public Queue autoDeleteQueue2() {
        return new Queue("test.queue2");
    }

    //利用路由键orange将Q1绑定到dirct交换机上
    @Bean
    public Binding binding1a(DirectExchange direct,Queue autoDeleteQueue1) {
        return BindingBuilder.bind(autoDeleteQueue1)
                .to(direct)
                .with("orange");
    }

    //利用路由键black将Q2绑定到dirct交换机上
    @Bean
    public Binding binding1b(DirectExchange direct,Queue autoDeleteQueue2) {
        return BindingBuilder.bind(autoDeleteQueue2)
                .to(direct)
                .with("black");
    }

    //利用路由键green将Q2绑定到dirct交换机上
    @Bean
    public Binding binding2a(DirectExchange direct,Queue autoDeleteQueue2) {
        return BindingBuilder.bind(autoDeleteQueue2)
                .to(direct)
                .with("green");
    }

}

一个路由键绑定多个队列

路由键为black的消息会被交换机转发到Q1和Q2

上述关系所需配置

@Configuration
public class RabbitMqConfig {

    @Bean
	public DirectExchange direct() {
		return new DirectExchange("test.direct");
	}

    @Bean
    public Queue autoDeleteQueue1() {
        return new Queue("test.quque1");
    }

    @Bean
    public Queue autoDeleteQueue2() {
        return new Queue("test.quque2");
    }

    //利用路由键black将Q1绑定到dirct交换机上
    @Bean
    public Binding binding1b(DirectExchange direct,Queue autoDeleteQueue1) {
        return BindingBuilder.bind(autoDeleteQueue1)
                .to(direct)
                .with("black");
    }

    //利用路由键black将Q2绑定到dirct交换机上
    @Bean
    public Binding binding2a(DirectExchange direct,Queue autoDeleteQueue2) {
        return BindingBuilder.bind(autoDeleteQueue2)
                .to(direct)
                .with("black");
    }

}

五、Topic(通配符模式)

这种模式与路由模式类似,但是路由键支持通配符匹配。生产者发送消息时指定一个带有通配符的路由键,交换机根据路由键和通配符规则将消息路由到对应的队列。消费者将队列绑定到交换机时也需要指定带有通配符的路由键。

例如,配置绑定关系的时候指定通配符路由键为*.*.rabbit,那么无论前面两个参数是什么,只要后面的参数是rabbit就满足条件,就会匹配上队列.

通配符语法:
* 可以完全代替一个单词。
# 可以替换零个或多个单词。

该工作模式一般使用Topic Exchange.

六、RPC(远程调用模式)

RabbitMQ还支持RPC(远程过程调用)模式,这种模式允许一个客户端发送请求消息到一个队列,并等待从另一个队列返回响应消息。这种模式常用于实现分布式系统中的远程服务调用。

多消费者监听一个队列是否会导致重复消费

实际开发中可以创建多个消费者监听一个队列,多个消费者都可以消费队列里的消息,不过在同一时间下,一条消息只会被一个消费者消费。

因为RabbitMQ的消息分发机制会确保消息在队列中的顺序性,并根据消费者的消费能力和策略来进行分发。

还可以在消费者里面做幂等、消息去重、记录消费的消息等操作来防止重复消费。

更多细节查看官方文档

RabbitMQ 教程 - “Hello World!” |兔子MQ --- RabbitMQ tutorial - "Hello World!" | RabbitMQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/619029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具,它将数字和统计信息转化为直观的视觉元素,如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域,包括: 商务分…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript(简称TS)的基础上,匹配 ArkUI 框架,扩展了声明式 UI 、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

【三十一】springboot+easyExcel实现多文件导出压缩包

互相交流入口地址 整体目录: 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…

springcloud -nacos实战

一、nacos 功能简介 1.1.什么是Nacos? 官方简介:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 Nacos的关键特性包括: 服务发现和服务健康监测动态配置服务动态DNS服务服务及其元数…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源,对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源,在主干代码的 applications 目录里聚集了很多原生的应用实现,那么如何编译这些代码就是我们这篇文章的主要…

宝塔面板Java项目部署,五步轻松搞定

当涉及到正规的开发项目时,最终的上线部署是至关重要的一个环节。本文旨在以最简单便捷的方法来教你如何完成项目的部署工作。 1. SSH下载地址 项目完成后需要使用SSH终端进行项目部署,以确保安全的远程访问、和操作远程服务器。 Xshell (支持Windows系…

若依-生成主子表

1. sql语句建表导入到数据库中: -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

第五届电子通讯与人工智能学术会议(ICECAI 2024, 5/31-6/2)

目录 1. 会议官方2. 会议新闻中华人民共和国教育部新闻 3. 出版历史4. 大会简介5. 主办单位与嘉宾主办单位承办单位主讲嘉宾组委会 6. 征稿主题7. 论文出版8. 参会说明 1. 会议官方 2024 5th International Conference on Electronic communication and Artificial Intelligenc…

笨方法自学python(三)-数学计算

数字和数学计算 这章练习里有很多的数学运算符号。我们来看一遍它们都叫什么名字 plus 加号-minus 减号/ slash 斜杠*asterisk 星号% percent 百分号< less-than 小于号greater-than 大于号< less-than-equal 小于等于号 greater-than-equal 大于等于号 print ("I …

算法-排序详解

目录 前言 比较排序 选择排序 插入排序 冒泡排序 归并排序 快速排序 非比较类排序 计数排序 桶排序 基数排序 排序的稳定性 排序算法的题目 前言 计算机的工作之一就是对数据的处理&#xff0c;处理数据有一个常见的操作就是对数据排序&#xff0c;比如新闻系统总…

AJAX前端与后端交互技术知识点以及案例

Promise promise对象用于表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值 好处&#xff1a; 逻辑更清晰了解axios函数内部运作机制成功和失败状态&#xff0c;可以关联对应处理程序能解决回调函数地狱问题 /*** 目标&#xff1a;使用Promise管理异步任…

SQL Server共享功能目录显示灰色无法自行选择

SQL Server共享功能目录显示灰色无法自行调整 一、 将之前安装SQL Server卸载干净 二、 清空注册表 1. 打开注册表&#xff0c;winR&#xff0c;输入regedit 2. 注册表-》编辑-》查找&#xff0c;输入C:\Program Files\Microsoft SQL Server\ 3. 注册表-》编辑-》查找&#x…

Redis 的 SDS 和 C 中字符串相比有什么优势?

C 语言使用了一个长度为 N1 的字符数组来表示长度为 N 的字符串&#xff0c;并且字符数组最后一个元素总是 \0&#xff0c;这种简单的字符串表示方式 不符合 Redis 对字符串在安全性、效率以及功能方面的要求。 C语言的字符串可能有什么问题&#xff1f; 这样简单的数据结构可…

Kubernetes基础理论介绍

前言 随着企业数字化转型的深入&#xff0c;为云而生的云原生架构和思想已被大量企业所接受。容器云、微服务、DevOps、 Serverless 已成为企业落地云原生的关键技术&#xff0c;而 Kubernetes 作为容器云的核心基础和事实标准&#xff0c;已成为当今互联网企业和传统 IT 企业…

Spring Cloud学习笔记(Nacos):基础和项目启动

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、基础和版本选择2、启动项目2.1、源码启动项目2.2、命令行启动 1、基础和版本选择 Nacos是用于服务发现和注册&#xff0c;是Spring Cloud Alibaba的核心模块。 根据文档&#xff0c;Spring Cloud Alibaba的版…

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域&#xff0c;3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型&#xff0c;通过添加适当的贴图&#xff0c;不仅可以增强模型的细节和真实感&#xff0c;还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

Linux 操作系统MySQL 数据库1

1.MySQL 数据库 数据库是“按照数据结构来组织、 存储和管理数据的仓库”。 是一个长期存储在计算机内的、 有组织的、 可共享的、 统一管理的大量数据的集合。 它的存储空间很大&#xff0c; 可以存放百万条、 千万条、 上亿条数据。 但是数据库并不是随意地将数据进行…

【RAG 论文】AAR:训练一个LLM喜欢的检索器来做RAG

论文&#xff1a;Augmentation-Adapted Retriever Improves Generalization of Language Models as Generic Plug-In ⭐⭐⭐ ACL 2023, Tsinghua & Microsoft&#xff0c;arXiv:2305.17331 论文速读 以往 RAG 的工作通常联合微调 retriever 和 LLM 导致紧密耦合&#xff0…

Python网络爬虫原理及实践

1 网络爬虫 网络爬虫&#xff1a;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 网络爬虫相关技术和框架繁多&#xff0c;针对场景的不同可以选择不同的网络爬虫技术。 2 Scrapy框架&#xff08;Python&#xff09; 2.1. Scrapy架构 2.1.1. 系统…

每日两题 / 108. 将有序数组转换为二叉搜索树 543. 二叉树的直径(LeetCode热题100)

108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 每次将数组对半分&#xff0c;数组的中点作为树的节点 先选择整个数组的中点作为根节点&#xff0c;然后选择对半分后的两个子数组的中点作为根节点的左右节点… /*** Definition for a binary tre…