当前位置: 首页 > news >正文

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的队列@Beanpublic Queue hello() {return new Queue("hello");}
}

二、WorkQueue(工作队列模式)

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

如下图:

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

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

上述关系配置

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

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

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

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

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

多个队列绑定一个交换机

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

如下图:

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

上述关系配置

@Configuration
public class RabbitMqConfig {//生产者发送消息到该交换机,交换机填test.fanout@Beanpublic FanoutExchange fanout() {return new FanoutExchange("test.fanout");}//消费者订阅该队列,队列填test.queue1@Beanpublic Queue autoDeleteQueue1() {return new Queue("test.queue1");}@Beanpublic Queue autoDeleteQueue2() {return new Queue("test.queue2");}//将Q1绑定到fanout交换机上@Beanpublic Binding binding1(FanoutExchange fanout,Queue autoDeleteQueue1) {return BindingBuilder.bind(autoDeleteQueue1).to(fanout);}//将Q2绑定到fanout交换机上@Beanpublic 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@Beanpublic FanoutExchange fanout1() {return new FanoutExchange("test.fanout1");}//生产者发送消息到该交换机,交换机填test.fanout2@Beanpublic FanoutExchange fanout2() {return new FanoutExchange("test.fanout2");}//消费者订阅该队列,队列填test.queue1@Beanpublic Queue autoDeleteQueue1() {return new Queue("test.queue1");}//将Q1绑定到fanout1交换机上@Beanpublic Binding binding1(FanoutExchange fanout1,Queue autoDeleteQueue1) {return BindingBuilder.bind(autoDeleteQueue1).to(fanout1);}//将Q1绑定到fanout2交换机上@Beanpublic 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@Beanpublic DirectExchange direct() {return new DirectExchange("test.direct");}//消费者订阅该队列,队列填test.queue1@Beanpublic Queue autoDeleteQueue1() {return new Queue("test.queue1");}@Beanpublic Queue autoDeleteQueue2() {return new Queue("test.queue2");}//利用路由键orange将Q1绑定到dirct交换机上@Beanpublic Binding binding1a(DirectExchange direct,Queue autoDeleteQueue1) {return BindingBuilder.bind(autoDeleteQueue1).to(direct).with("orange");}//利用路由键black将Q2绑定到dirct交换机上@Beanpublic Binding binding1b(DirectExchange direct,Queue autoDeleteQueue2) {return BindingBuilder.bind(autoDeleteQueue2).to(direct).with("black");}//利用路由键green将Q2绑定到dirct交换机上@Beanpublic Binding binding2a(DirectExchange direct,Queue autoDeleteQueue2) {return BindingBuilder.bind(autoDeleteQueue2).to(direct).with("green");}}

一个路由键绑定多个队列

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

上述关系所需配置

@Configuration
public class RabbitMqConfig {@Beanpublic DirectExchange direct() {return new DirectExchange("test.direct");}@Beanpublic Queue autoDeleteQueue1() {return new Queue("test.quque1");}@Beanpublic Queue autoDeleteQueue2() {return new Queue("test.quque2");}//利用路由键black将Q1绑定到dirct交换机上@Beanpublic Binding binding1b(DirectExchange direct,Queue autoDeleteQueue1) {return BindingBuilder.bind(autoDeleteQueue1).to(direct).with("black");}//利用路由键black将Q2绑定到dirct交换机上@Beanpublic 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

相关文章:

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

前提是已经安装并启动了rabbitmq,并且项目已经引入rabbitmq,完成了配置。 不同模式所需参数不同,生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…...

Ansible(二)

一、Playbook基础 1.1 Playbook定义 Playbook其实是Ansible服务的一个配置文件,Ansible使用Playbook的YAML语言配置编写成操作需求,实现对远端主机或策略部署,实现对远端主机的控制与管理。 1.2 Playbook组成 Tasks:任务&…...

【linux】linux工具使用

这一章完全可以和前两篇文件归类在一起,可以选择放一起看哦 http://t.csdnimg.cn/aNaAg http://t.csdnimg.cn/gkJx7 拖更好久了,抱歉,让我偷了会懒 1. 自动化构建工具 make , makefile make 是一个命令,makefile 是一个文件&…...

Docker需要代理下载镜像

systemctl status docker查看docker的状态和配置文件是/usr/lib/systemd/system/docker.service vi /usr/lib/systemd/system/docker.service, 增加如下配置项 [Service] Environment"HTTP_PROXYhttp://proxy.example.com:8080" "HTTPS_PROXYhttp:…...

Debian操作系统简史

一,起源和初衷 Debian项目始于1993年,由Ian Murdock发起,他当时是普渡大学的一名学生。Debian的名字来源于Ian Murdock和他的妻子Debra的组合。Debian的核心理念是创建一个完全自由的操作系统,它遵循严格的自由软件指导原则。 二…...

课堂练习——路由策略

需求:将1.1.1.0/24网段重发布到网络中,不允许出现次优路径,实现全网可达。 在R1上重发布1.1.1.0/24网段,但是需要过滤192.168.12.0/24和192.168.13.0/24在R2和R3上执行双向重发布 因为R1引入的域外路由信息的优先级为150&#xff…...

Agent AI智能体:未来社会的角色、发展与挑战

Agent AI智能体在未来社会中的角色、发展路径以及可能带来的挑战是一个非常值得关注的话题。让我们来深入探讨一下这些方面。 1. 角色与应用场景 Agent AI智能体是指具有自主决策能力和执行能力的人工智能系统,它们可以代表个人或组织执行各种任务和活动。在未来社…...

mybatis-plus使用指南(1)

快速开始 首先 我们 在创建了一个基本的springboot的基础框架以后&#xff0c;在 pom文件中 引入 mybatisplus的相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5…...

python自定义x坐标名称

在画完图后加上 x[0.1,0.5,1.0,2.0,4.0,6.0,8.0] plt.xticks(x) import matplotlib.pyplot as pltx [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10]plt.plot(x, y) plt.xticks(x, [A, B, C, D, E]) # 设置x轴坐标位置和标签 plt.show()要自定义x坐标名称&#xff0c;你可以使用matplo…...

图论专题训练

leecode 547 并查集 class Solution { public:int findCircleNum(vector<vector<int>>& isConnected) {ini();int len isConnected.size();for(int i0;i<len;i){for(int j0;j<len;j)if(isConnected[i][j]){unio(i,j);}}int ans 0;for(int i0;i<len;…...

持续总结中!2024年面试必问 100 道 Java基础面试题(四十二)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 100 道 Java基础面试题&#xff08;四十一&#xff09;-CSDN博客 八十三、如何判断一个对象是否应该被垃圾回收&#xff1f; 在Java中&#xff0c;判断一个对象是否应该被垃圾回收的关键在于对象的引用状态。垃圾…...

Linux 之 tail 命令

一、基本语法 tail [option] [file] 其中 option 是可选参数&#xff0c;用于定制命令的行为&#xff0c;file 则是要处理的目标文件名。 二、常用参数 几个常用的 option 选项&#xff1a; -n&#xff1a;显示文件的最后 n 行&#xff0c;默认为 10 行。-f&#xff1a;实…...

【Android学习】简单的登录页面和业务逻辑实现

实现功能 1 登录页&#xff1a;密码登录和验证码登录 2 忘记密码页&#xff1a;修改密码 3 页面基础逻辑 java代码 基础页面 XML login_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.and…...

Mysql数据库的基础学习

为什么使用数据库&#xff1f; 1.持久化&#xff1a;将数据保存到可掉电式存储设备中以供使用。 数据库相关概念&#xff1a; DB:数据库&#xff08;Databass&#xff09;即存储数据的仓库&#xff0c;本质是一个文件系统&#xff0c;保存了一系列有组织的数据DBMS:数据库管…...

CentOS7 安装 Kamailio

https://www.kamailio.org/wiki/packages/rpms 官方文档说 yum -y install yum-utils yum-config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo 但目前这样其实行不通 需要这样做&#xff1a; yum install --disablerepokamailio --enablerepokamai…...

Tomcat启动闪退问题解决办法

本文将通过一系列诊断步骤帮助您找出原因&#xff0c;并提供相应的解决办法。 诊断步骤 查看日志文件 Tomcat的日志文件是解决启动问题的第一线工具。查看logs目录下的catalina.out和其他日志文件&#xff0c;这些文件经常记录了错误信息和系统崩溃的线索。 cat /path/to/to…...

单元测试之JUnit5知识点总结及代码示例

单元测试是软件开发过程中的一种验证手段&#xff0c;它针对最小的可测试部分&#xff08;通常是函数或方法&#xff09;进行检查和验证。其实单元测试还是挺重要的&#xff0c;不过国内很多公司的项目其实并没有做好单元测试&#xff0c;或者根本就没做单元测试&#xff0c;原…...

什么是数据平台——企业构建Data+AI的基础数据底座需要的决策参考

什么是数据平台 标准的解释是这样的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 数据平台是指将各类数据进行整合、存储、处…...

Oracle 流stream数据的复制

Oracle 流stream数据的复制 --实验的目的是捕获scott.emp1表的变化&#xff0c;将变化应用到远程数据库scott.emp1表中。 --设置初始化参数 AQ_TM_PROCESSES1 COMPATIBLE9.2.0 LOG_PARALLELISM1 GLOBAL_NAMEStrue JOB_QUEUE_PROCESSES2 --查看数据库的名称&#xff0c;我的为o…...

「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标

美国网络安全和基础设施安全局&#xff08;CISA&#xff0c;CyberSecurity & Infrastructure Security Agency&#xff09;于2024年5月开始呼吁企业是时候将网络安全融入到技术产品的设计和制造中了&#xff0c;并发起了安全设计承诺行动&#xff0c;该承诺旨在补充和建立现…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...