RabbitMQ从入门到实战-2

news2025/3/13 18:22:12

文章目录

  • Java客户端
  • 快速入门
  • WorkQueue(多消费)
    • 能者多劳配置
  • 交换机
    • fanout交换机
      • 案例
    • Direct交换机
    • Topic交互机
  • 声明队列和交互机(IDEA中)
    • 基于Bean声明队列和交换机
    • 基于注解声明(推)
  • 消息转换器
    • 配置Json消息转换器
  • 业务改造(实际例子)

这篇讲解通过java客户端操作rabbitmq

Java客户端

可以通过不同客户端操作mq
我们这里用spring AMQP(AMQP是一种协议)
在这里插入图片描述

快速入门

交换机需要和队列进行绑定,而我们的消费者需要监听队列,生产者指定生产到哪个队列

这里我们先不发交换机,直接发送到队列,为了简单一点
自己创建队列哈,这里就不说了
在这里插入图片描述
使用springAMQP过程

在这里插入图片描述
这里配置根据自己的情况不同调整
在这里插入图片描述
提供生产者发送消息
提供的也是一个template,convertAndSend方法去发送消息,测试类中编写完直接运行即可
在这里插入图片描述
提供消费者监听simple.queue,这里的接收参数和我们发送参数类型一致,spring会帮我们自动转化并接收执行方法中的内容
然后将项目启动就可以监听了
在这里插入图片描述
在这里插入图片描述

WorkQueue(多消费)

一个队列,多个消费者
消费者之间属于竞争关系(队列中的一个数据只能被一个消费者获取)
这点和交换机与队列的关系不同(由交换)

消费者从queue中获取数据,进行处理,如果不设置其他操作,每一个消费者只需要处理n/m个数据(n为生产者生成数,m为消费者消费数)

下面我们在一个类建了两个消费者方法,一般不会这样做(因为他们消耗的是同一个机器资源)
正常我们会写一个消费者方法,复制多个springboot项目实例部署,形成集群
启动多个消费者,绑定到这个队列,这样里面的代码逻辑也相同,减轻单个消费者服务器的压力

在这里插入图片描述
生产者发50条数据
在这里插入图片描述
这里我设置了两个消费者
会均匀分一人一个这样,这里消费者2接收1、3、5…
消费者1接收2、4、6、8…
在这里插入图片描述
在这里插入图片描述

能者多劳配置

新需求
让消费者1每秒处理40条消息,消费者2每秒处理5条消息
代码改造
在这里插入图片描述
出现问题
我们消息消费速度跟不上消息分配速度
我们消息分配还是一人一条这样分配,先给1再给2
其实在1和2处理完之前按就分配完了,1和2都分配了50条,就是平均分配
这样没有考虑到谁消费的快的问题,这样的话,2处理的慢,你还给人分50条就太离谱了,影响整体性能
如果可以让1消费完去帮助2消费就可以了
在这里插入图片描述

那么如何让先消费完的消费者优先获取消息呢?

如何发挥我们MQ消费者最大性能(处理完的先分配)
而不是轮流给,做以下设置
保证同一时刻给一条信息,处理完就会再给,不空闲
这样处理快的可能处理2条的同时慢的处理1条,发挥最大效能
在消费者项目的配置文件中进行配置
在这里插入图片描述
这样就实现了最大效率
在这里插入图片描述

交换机

交换机绑定队列,由其交换机类型决定发送的到绑定队列的方式
发送到交互机要写三个参数,(交换机名,队列名,信息)
在这里插入图片描述
在这里插入图片描述

fanout交换机

队列发的消息,只可能被一个消费者处理
而通过我们这个交互机可以达到同一个消费被多个连接不同队列的消费者处理(因为队列没有广播性质)

应用场景:比如说我们之前的支付案例
我们会干1.通知订单服务2.通知短信服务3.通知积分服务
三件事都要做,不同的微服务相当于消费者,不同服务连接不同队列
如果你只能发送一条信息,只有三者之一可以实现,如果可以广播,三者都可以实现

在这里插入图片描述

案例

在这里插入图片描述
声明队列,在控制台添加就行,这里不展示
在这里插入图片描述
这里也可以用他默认的交互机,也可以自己建,从type中选择类型
在这里插入图片描述
消费者设置
在这里插入图片描述
发送到交互机要写三个参数,(交换机名,队列名,信息)
我们这里因为要发给交换机,队列直接弄成null,如果不写null,会把你的交换机名当成队列名发送
在这里插入图片描述
然后发送,两个队列都会监听到
在这里插入图片描述

Direct交换机

交换机和队列链接时候设置bingkey(连接在同一个交互机的该值可以相同)
然后我们设置三个参数时候
设置第二个参数,只有bindkey=routingkey这两才,对应的队列才可以接收到交换机的消息
(由于bindkey可相同,可以实现多发和单发两种效果)
在这里插入图片描述

案例
bindkey不是队列的属性,而是交换机指定和队列相连的属性
所以同一个队列可能对交互机而言有多个bindkey
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
指定红两个都可以收到,而指定蓝色,只有消费者1可以收到
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Topic交互机

只有Topic交互机连接的队列的bindkey里带#或者*才会识别为通配符

一个key代替多种routingkey含义
减少了一个个绑定key的麻烦,而且你之后一个类型可以直接用这个通配符(符合你想处理的情况),可扩展性
这样的话,你发送china.union也会到queue1,发送china.mei也会发到queue1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

声明队列和交互机(IDEA中)

基于Bean声明队列和交换机

在这里插入图片描述
队列和交换机直接new(也可以用Bulider创建,有ExchageBuilder和QueueBuilder),连接需要
建队列有个durable属性可以选择(默认持久),持久化,队列会持久化到磁盘(通常都是持久化)
这里bind没有指定key因为是fanout交换机是广播 ,如果是别的话,可以跟一个with方法指定交换名字
在这里插入图片描述
这些交换机和队列会在我们启动项目时候声明处理(停止后也不会消失)

基于注解声明(推)

使用bean还是比较麻烦,写的代码太多
而且每个方法只能声明一个bindkey,要写n个就得n个方法
在这里插入图片描述
还是之前的需求
用@Rabbitistener()+@QueueBinding()+@Queue()+@Exchage()只是声明bindings
声明这个后,我们的方法会作为队列的消费者,队列也会和声明的交换机产生对应的bindkey
这样的话我们的方法也会成为定义队列的消费者
可以使用ctrl+p提示
在这里插入图片描述

在这里插入图片描述
同样的项目启动时候这些设置会持久化到mq中

消息转换器

之前我们发送消息
在这里插入图片描述
用convertAndSend方法,该方法最后一个参数其实为Object类型
我们可以传入不同对象传到Exchange中
而我们学的这个消息转换器就是帮我们转换对象的
在这里插入图片描述
发送map到声明的队列
在这里插入图片描述
这是我们MQ中收到的消息
这里Spring AMQP默认用了JDK自带的对象序列化,将对象序列化字节的方式去发送消息
在这里插入图片描述

默认就是用这个SimpeMessageConverter类的createMessage来实现消息转换
createMessage逻辑梳理:
如果本身就是字节数组直接传递,如果是字符串getBytes传递
如果实现了Serializable接口就调用SerializableUtils序列化我们的对象(用对象流写入对象)
在这里插入图片描述

JDK默认序列化很不好,需要使用其他消息转换器
在这里插入图片描述

配置Json消息转换器

该消息转换器要在生产者消费者都要配(实现统一匹配)
在这里插入图片描述

在这里插入图片描述

业务改造(实际例子)

从OpenFegin的同步调用改成基于MQ的异步调用

订单状态在支付失败时候更新为支付失败,通知服务和积分服务就不会执行
而我们的支付成功时候,三个服务都会执行
所以说这三个服务收消息的时候不是说每一次大家都要收
而是按照业务来,direct和topic都可以,这里我用direct

所以我们这里用direct的交换机
对应设置的交换机名称和队列和bindkey都显示了,还有对应的业务逻辑
在这里插入图片描述
这边是我们原代码,上面的服务其实我们只实现了订单,所以这里我们只改这个订单变成异步通信(MQ)
在这里插入图片描述
发送业务逻辑的修改
作为异步的一个逻辑我们try起来,防止影响我们核心业务
在这里插入图片描述
监听者
对应参数就是发送者发送的消息(类型要相同)
在这里插入图片描述

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

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

相关文章

Mac 配置 Maven JDK

不使用 Homebrew,创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi ~/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试

前言 当今各种大语言模型百花齐放,为了方便使用者更加自由的使用大模型,将大模型变成如同棒球棍一样每个人都能用,并且顺手方便的工具,本地私有化具有重要意义。 本次测试使用ollama完成模型下载,过程简单快捷。 1、进…

Ubuntu通过Ollama部署deepseek和千问

一、准备文件 本地服务器是Ubuntu20.04,输入命令uname -a即可查看 部署方式有多样,点击Ollama访问官网 可复制命令直接粘贴下载,但是过程比较慢,所以我推荐下面这种方式 从githubReleases ollama/ollama GitHub上下载ollama的…

第十一届蓝桥杯单片机国赛

什么?4T模拟赛和省赛做起来轻轻松松?不妨来挑战一下第十一届国赛,这一届的国赛居然没考超声波、串口通信!只要你正确地理解了题目的意思,规避出题人挖的坑,拿个国一轻轻松松。 附件:第十一届蓝桥…

【eNSP实战】MSTP与VRRP配合使用

拓扑图 要求: PC1划分在vlan10;PC2划分在vlan20;主机IP和网关如图所示,这里不做展示LSW1配置vlan10的根交换机,vlan20的备根交换机;LSW2配置vlan20的根交换机,vlan10的备根交换机LSW1配置vlan…

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图,画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具,当然是墨刀、Axure、Figma和Sketch了,但是很多刚入行的产品经理不了解自己适合哪些工具,本文将从核心优势、局限短板、协作能…

es-索引详解

在 Elasticsearch 中,**索引(Index)**是核心概念之一,类似于关系型数据库中的“表”。索引用于存储、组织和检索文档(Document)。以下是关于 Elasticsearch 索引的详细解析: 1. 索引的基本概念 …

SAP接口方式之HTTP请求发布Restful服务

SAP restful http 接口集中管理发布(SICF) 项目上有很多restful接口的需求,其中涉及到多个外围系统,就想着如何通过只发布一个服务,而不用通过Webservice,也不通过RFC方式,让个外围系统传入不同的报文,来决…

Spark-TTS:基于大模型的文本语音合成工具

GitHub:https://github.com/SparkAudio/Spark-TTS Spark-TTS是一个先进的文本到语音系统,它利用大型语言模型(LLM)的强大功能进行高度准确和自然的语音合成;旨在高效、灵活、强大地用于研究和生产用途。 一、介绍 Sp…

Netty基础—3.基础网络协议一

大纲 1.网络基础的相关问题总结 2.七层模型和四层模型 3.物理层(网线 光缆 01电信号) 4.数据链路层(以太网协议 网卡mac地址) 5.网络层(IP协议 子网划分 路由器) 6.传输层(TCP和UDP协议 Socket 端口) 7.应用层(HTTP协议 SMTP协议) 8.浏览器请求一个域名会发生什…

【mysql】centOS7安装mysql详细操作步骤!

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式 需要 root 权限,使用 root 用户进行命令操作。 1. 查看 CentOS 版本 cat /etc/redhat-release2. 安装rpm包,以8为例 打开 MySQL 官方 yum 仓库网站,获取与当前 CentOS …

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成(RAG)的基本定义 检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息,并将其作为提示&…

笔试刷题专题(一)

文章目录 最小花费爬楼梯(动态规划)题解代码 数组中两个字符串的最小距离(贪心(dp))题解代码 点击消除题解代码 最小花费爬楼梯(动态规划) 题目链接 题解 1. 状态表示&#xff1…

LeetCode977有序数组的平方

思路①:先平方,后快排,输出(基准元素,左小右大) 时间复杂度:O(nlogn) 思路②:双指针左右开弓,首先原数组已经是按照非递减顺序排序,那…

网络变压器的主要电性参数与测试方法(4)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…

Windows10 WSL又又又一次崩了 Docker Desktop - Unexpected WSL error

问题:Windows10 WSL又又又一次崩了 这回报错: 然后再打开WSL Ubuntu就卡住了,等很长时间没反应,就关掉了。 手动启动Docker Desktop,报错: An unexpected error occurred while executing a WSL comman…

【前端基础】:HTML

超链接标签: a href: 必须具备, 表示点击后会跳转到哪个页面. target: 打开方式. 默认是 _self. 如果是 _blank 则用新的标签页打开 <a href"http://www.baidu.com">百度</a>链接的几种形式: 外部链接: href 引用其他网站的地址 <a href"http…

JVM垃圾收集器合集

前言&#xff1a;JVM GC收集器的回顾与比较 JVM&#xff08;Java虚拟机&#xff09;中的垃圾收集器是自动管理内存的重要机制&#xff0c;旨在回收不再使用的对象所占用的内存空间。以下是JVM中几种常见的垃圾收集器的详细介绍&#xff1a; 一、新生代垃圾收集器 1.Serial收集…

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…