RabbitMQ从入门到实战-2
文章目录
- 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起来,防止影响我们核心业务

监听者
对应参数就是发送者发送的消息(类型要相同)

相关文章:
RabbitMQ从入门到实战-2
文章目录 Java客户端快速入门WorkQueue(多消费)能者多劳配置 交换机fanout交换机案例 Direct交换机Topic交互机 声明队列和交互机(IDEA中)基于Bean声明队列和交换机基于注解声明(推) 消息转换器配置Json消息转换器 业务改造&#…...
【每日八股】计算机网络篇(四):HTTP
目录 HTTP 与 HTTPS 的区别?HTTPS 加密与认证的过程?ClientHelloServerHello客户端回应服务端回应 HTTPS 一定安全可靠吗?HTTPS 状态码的含义?HTTP 缓存有哪些实现方式?HTTP 1.0、HTTP 1.1、HTTP 2.0 和 HTTP 3.0 的区…...
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的…...
责任链模式的C++实现示例
核心思想 责任链模式是一种行为设计模式,允许多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。请求沿着处理链传递,直到某个对象处理它为止。 解决的问题 解耦请求发送者与处理者:请求的发送者无需知道具…...
微服务新手入门
一、微服务概念 微服务是一种软件架构风格,ta是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。 微服务 - 服务拆分 - 远程调用 - 服务治理 - 请求路由 - 身份认证 - 配置管理 - 服务保护 - 分布式事务 - 异步通信 - 消息可靠性 - 延迟消…...
第十一届蓝桥杯单片机国赛
什么?4T模拟赛和省赛做起来轻轻松松?不妨来挑战一下第十一届国赛,这一届的国赛居然没考超声波、串口通信!只要你正确地理解了题目的意思,规避出题人挖的坑,拿个国一轻轻松松。 附件:第十一届蓝桥…...
【eNSP实战】MSTP与VRRP配合使用
拓扑图 要求: PC1划分在vlan10;PC2划分在vlan20;主机IP和网关如图所示,这里不做展示LSW1配置vlan10的根交换机,vlan20的备根交换机;LSW2配置vlan20的根交换机,vlan10的备根交换机LSW1配置vlan…...
【每日学点HarmonyOS Next知识】tab拦截、组件方法做参数、自定义组件链式调用、多次观察者监听、横竖屏切换
1、HarmonyOS Tab组件里的tabBar点击如何拦截,根据情况判断是否允许切换tab? Tab组件里的tabBar点击如何拦截,根据情况判断是否允许切换tab 暂时没有tabBar点击拦截功能实现,可以使用TabsController自定义页签以及并在其中添加事…...
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 …...
大白话 Vue 中的keep - alive组件,它的作用是什么?在什么场景下使用?
大白话 Vue 中的keep - alive组件,它的作用是什么?在什么场景下使用? 什么是 keep-alive 组件 在 Vue 里,keep-alive 是一个内置组件,它就像是一个“保存盒”,能把组件实例保存起来,而不是每次…...
当量子计算遇上互联网安全:挑战与革新之路
当量子计算遇上互联网安全:挑战与革新之路 量子计算,一个被誉为下一次科技革命的前沿技术,正在以惊人的速度发展。这项技术以其超越经典计算机的计算能力,为科学、医药和物流等领域带来了颠覆性变革。然而,对于互联网…...
Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能
灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发(第3版) | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…...
使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库
定义 检索增强生成(RAG)的基本定义 检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息,并将其作为提示&…...
笔试刷题专题(一)
文章目录 最小花费爬楼梯(动态规划)题解代码 数组中两个字符串的最小距离(贪心(dp))题解代码 点击消除题解代码 最小花费爬楼梯(动态规划) 题目链接 题解 1. 状态表示࿱…...
LeetCode977有序数组的平方
思路①:先平方,后快排,输出(基准元素,左小右大) 时间复杂度:O(nlogn) 思路②:双指针左右开弓,首先原数组已经是按照非递减顺序排序,那…...
React.js 基础与进阶教程
React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库,专为构建用户界面(UI)设计,尤其适用于单页面应用(SPA)。它采用组件化开发模式,使 UI 结构更加清晰、可维护性更…...
网络变压器的主要电性参数与测试方法(4)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.1基于ES的语义搜索(BERT嵌入向量)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 基于Elasticsearch与BERT的语义搜索架构设计与实战1. 传统搜索的局限性与语义搜索的崛起1.1 关键词搜索 vs 语义搜索1.2 Elasticsearch向量检索演进历程关键版本特性对比 2.…...
Windows10 WSL又又又一次崩了 Docker Desktop - Unexpected WSL error
问题:Windows10 WSL又又又一次崩了 这回报错: 然后再打开WSL Ubuntu就卡住了,等很长时间没反应,就关掉了。 手动启动Docker Desktop,报错: An unexpected error occurred while executing a WSL comman…...
XMI(XML Metadata Interchange)和XML之间的关系
XMI(XML Metadata Interchange)和XML之间的关系可以从以下几个方面进行阐述: 一、定义与背景 XML: XML(eXtensible Markup Language)是一种标记语言,被设计用来传输和存储数据。它是一种自描述…...
《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》
在游戏开发领域,鸿蒙系统的崛起为开发者们带来了前所未有的机遇与挑战。尤其是在开发基于鸿蒙系统的人工智能游戏时,实现智能NPC的行为逻辑与游戏剧情紧密结合,成为了打造沉浸式游戏体验的关键。 鸿蒙系统作为一款面向全场景的分布式操作系统…...
【前端基础】:HTML
超链接标签: a href: 必须具备, 表示点击后会跳转到哪个页面. target: 打开方式. 默认是 _self. 如果是 _blank 则用新的标签页打开 <a href"http://www.baidu.com">百度</a>链接的几种形式: 外部链接: href 引用其他网站的地址 <a href"http…...



