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

news2025/1/14 0:58:19

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

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

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

一、Simple(简单模式)

一些概念queue:队列

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

如下图:

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

上述关系配置

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

二、WorkQueue(工作队列模式)

一些概念queue:队列

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

如下图:

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

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

上述关系配置

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

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

一些概念:exchange:交换机,queue:队列

在该模式下,交换机一般使用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(路由模式)

一些概念:exchange:交换机,routing key:路由键,queue:队列

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

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

多个路由键绑定一个队列

如下图:

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(通配符模式)

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

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

六、RPC(远程调用模式)

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

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

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

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

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

更多细节查看官方文档

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

县供电公司员工向媒体投稿发文章用亲身经历告诉你并不难

在县供电公司的日子里,我肩负着一项至关重要的使命——信息宣传工作。这不仅仅是一份职责,更是连接公司与外界的桥梁,通过新闻稿件传递我们的声音,展示我们的成果。然而,回忆起刚刚踏入这个领域的时光,那段经历至今让我感慨万千。 初涉投稿,步履维艰 刚接手这项工作时,我的投稿…

信息化飞速发展下,源代码防泄密方案该如何选择?常见四种有效方案分享

信息化时代发展迅速,数据防泄露一词也频繁的出现在我们身边。无论企业或政府单位,无纸化办公场景越来越多,数据泄露的时间也层出不穷。例如:世界最大职业中介网站Monster遭到黑客大规模攻击,黑客窃取在网站注册的数百万…

Dockerfile实践java项目

目的:用java项目测试dockerfil部署(前提是安装好了docker) 部署准备文件如下 1. java项目 java项目demo地址 https://gitee.com/xiaoqu_12/dockerfileDemo.git 或者百度网盘直接下载打包好的jar包 链接:https://pan.baidu.com/s/…

PostgreSQL的学习心得和知识总结(一百四十一)|深入理解PostgreSQL数据库数据库角色的使用及预定义角色的原理

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

【计算机毕业设计】基于SSM++jsp的电子竞技管理平台【源码+lw+部署文档+讲解】

目录 1 绪论 1.1 研究背景 1.2 目的和意义 1.3 论文结构安排 2 相关技术 2.1 SSM框架介绍 2.2 B/S结构介绍 2.3 Mysql数据库介绍 3 系统分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 运行可行性分析 3.2 系统性能分析 3.2.1 易用性指标 3.2.2 可…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件,用于定义客户端的代理规则。您可以在 PAC 文件中编写规则,根据不同的目标网址或其他条件,决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上,并在客户端配置浏…

QT学习PCL库代码

找关键点keypoints 绿色的点就是keypoints outofcore

应用软件安全保证措施方案书

系统安全保证措施方案—word原件 软件全套资料进主页获取或者本文末个人名片直接获取。

【Docker学习】docker run的端口映射-p和-P选项

docker run的端口映射选项分为-p(小写,全称--publish),-P(大写,全称--publish-all),之前认为只有改变容器发布给宿主机的默认端口号才会进行-p的设置,而不改变默认端口号…

STC8增强型单片机开发 【第一个程序 - 点亮第一盏灯】

目录 一、创建项目 1. 创建一个新的项目 ​编辑 2. 配置开发板信息 ​编辑 3. 取消汇编配置 4. 项目结构 二、编码实现 1. 项目准备 2. 代码实现 点灯: 熄灯: 3. 编译烧录运行 配置编译输出 保存和编译代码 ​编辑 烧录 一、创建项目 1. …

静态照片怎么合成gif?详细介绍一个方法

我们在各大平台中都能看到各种样式的gif动图。Gif动图其实就是由一帧一帧的静态图片合成的动态效果的gif,想要制作gif动画可以通过使用在线图片合成(https://www.gif5.net/)工具-GIF5工具网,手机、pc均可操作,只需要上…

STC8增强型单片机开发——C51版本Keil环境搭建

一、目标 了解C51版本Keil开发环境的概念和用途掌握C51版本Keil环境的安装和配置方法熟悉C51版本Keil开发环境的使用 二、准备工作 Windows 操作系统Keil C51 安装包(可以从Keil官网下载)一款8051单片机开发板 三、搭建流程 环境搭建的基本流程&#xf…

第八届大数据与物联网国际会议(BDIOT 2024)即将召开!

第八届大数据与物联网国际会议(BDIOT 2024)将于2024年9月14-16日在澳门圣若瑟大学举行。数聚未来,物联世界!BDIOT 2024旨在搭建为各位与会代表展示自己研究成果、分享经验、建立联系和开展合作的平台,共同探讨大数据与物联网领域的未来发展方…

【CSS】认识CSS选择器及各选择器对应的用法

目录 一、什么是CSS? 二、CSS 选择器 1. 标签选择器 2. 类选择器 3. ID选择器 4. 通配符选择器 5. 复合选择器 一、什么是CSS? CSS(Cascading Style Sheet),层叠样式表。它与 HTML(超文本标记语言)一起使用&am…

2024第16届成都教育连锁加盟展6月1日举办 免费参观

2024第16届成都教育连锁加盟展6月1日举办 免费参观 邀请函 主办单位: 中国西部教体融合博览会组委会 承办单位:重庆港华展览有限公司 博览会主题:责任教育科技兴邦 幼教、普教、高教、校外教育、K12学科辅导、婴幼儿教育、兴趣辅导、学…

C++从入门到精通---模版

文章目录 泛型编程函数模版模版参数的匹配原则类模版类模版的定义格式类模版的实例化 总结 泛型编程 泛型编程是一种编程范式,旨在实现通用性和灵活性。它允许在编写代码时使用参数化类型,而不是具体的类型,从而使代码更加灵活和可重用。 在…

[机器学习-01]一文了解|机器学习简介、工具选择和Python包基础应用

目录 前言 正文 01-机器学习简介 (1)诞生过程 (2)人工智能、机器学习和深度学习之间的关系 (3)机器学习核心 02-机器学习工具 (1)Anaconda简介 (2)Jupyte…

牛客NC97 字符串出现次数的TopK问题【中等 哈希+优先级队列 Java/Go】

题目 题目链接: https://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee 核心 哈希,优先级队列Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返…

固定资产管理系统参考论文(论文 + 源码)

【免费】固定资产管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282536 固定资产管理系统 摘 要 随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。 固…

加州大学欧文分校英语中级语法专项课程04:Intermediate Grammar Project学习笔记(完结)

Intermediate Grammar Project Course Certificate Specialization Certificate Specialization Intro Course Intro 本文是学习 Coursera: Intermediate Grammar Project 这门课的学习笔记。 文章目录 Intermediate Grammar ProjectWeek 01: IntroductionCapstone Introducti…