RabbitMQ入门到实战——基础篇

初识RabbitMQ:高性能异步通讯组件

同步调用

异步调用

 

场景:1.对结果不关心时异步。订单状态-异步,查询-同步
2.影响性能。调用链超长,可改成异步 

MQ技术对比

kafka日志收集

RabbitMQ整体架构

 快速入门

 

 

  • 交换机只负责路由消息,没有消息保存能⼒
  • 发信息前,queue需要binding绑定交换机

数据隔离

给每个项目创建自己的用户user和虚拟主机virtual host。不同virtual host数据隔离

 

Java客户端 

RabbitMQ Tutorials — RabbitMQ 

AMQP 和 Spring AMQP

RabbitMQ 中的 AMQP 协议:AMQP 的全称是 Advanced Message Queue Protocol,即高级消息队列协议。RabbitMQ 就是根据这个协议开发的。AMQP 是一个标准的协议,不仅 RabbitMQ,如果你想自己实现一个消息队列,也可以按照这个协议来设计。 AMQP 协议主要由几个部分组成,如下图所示。

 

Publisher:消息的生产者,它负责发送消息。
Consumer:消息的消费者,它负责接收消息。
中间的部分,用兔子头标识的就是 RabbitMQ,功能如下:
生产者:发消息到某个交换机。
消费者:从某个队列中取消息。
交换机(Exchange):像路由器一样,负责将消息从生产者发送到对应的队列。
队列(Queue):存储消息的地方。
路由(Routes):转发,就是怎么把消息从一个地方转到另一个地方(比如从生产者转发到某个队列)。 

快速入门 

 1.引入依赖

2.配置RabbitMQ信息(application.yml)

 

 

3.使⽤RabbitTemplate 发送信息(Publisher)

 

4.使⽤注解 @RabbitListener 监听

work模型 

需求:模拟WorkQueue,实现⼀个队列绑定多个消费者

 默认一个消费者一个消费者轮流处理消息,但消费者处理能力不同,消费者1处理块。结果:消费者1率先处理完25条信息,消费者2缓慢处理25条信息。 问题:资源分配不合理。需要考虑队列的处理业务能⼒,能者多劳。

⾯试题:如何处理消息队列中堆积问题
1.绑定多个消费者,加快消息处理速度,解决消息堆积
2.优化业务代码:缓存、池化、异步(MQ、Java代码的异步-事件监听、线程池)

交换机 

直发给队列,只能有一个服务接收到消息,其他服务无法获取到,所以需要交换机路由转发。

Fanout交换机 

效果:Fanout⼴播交换机,两个队列都收到了信息

交换机作⽤:接收信息,路由信息

Direct交换机

 需求:不同服务需要收到不同的消息

 效果:根据Key接收消息

 Topic交换机

Direct能做的 Topic也能做,Topic在Key上更灵活方便

 

 

声明队列和交换机

问题:控制台创建队列和交换机很麻烦且易错(开发、生成、测试都要重新创建一遍) ,需要使用Java代码声明队列和交换机

注意:⼀般将配置类创建在消费者中,因为消费者更加关⼼交换机和队列及其关系,而生产者只要给对应交换机发信息即可。 

方式一(基于Bean,麻烦)

代码实现:在Config类中 new 或者 ⽤⼯⼚直接创建交换机与队列,并进⾏绑定

 

缺点:当创建Direct交换机需要绑定多个Key时,要写多个Bean类,代码冗余 

方式二(基于注解,简单)

 基于@RabbitListener注解对监听器进⾏绑定
@RabbitListener(bindings = @QueueBinding(xxx))

总结

 

消息转换器

发信息为⼀个Map 对象,⽽不是String 

 

追源码

 解决:使⽤JSON序列化代替默认的JDK序列化(Spring MVC包含Jackson依赖,只需设定Bean即可)

 

 

 

业务改造

 1.生产者和消费者都引入amqp依赖

 2.生产者和消费者都配置amqp,application.yml

3.定义JSON转化器(common中定义Jackson Bean类:Jackson2JsonMessageConverter())

4.消费者编写监听器

队列名、Key、交换机(Topic)已在需求中定义好
message 观察原先调用支付服务中的已支付接口

5.生产者发消息

写⽣产者接⼝(修改具体业务接⼝的代码逻辑),在业务内使⽤ RabbitTemplate发信息,message为Long类型的订单ID。业务内发信息的⽚段建议try-catch,以免影响业务⽽回滚

 参考:MQ基础-01.RabbitMQ课程介绍_哔哩哔哩_bilibili

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

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

相关文章

Linux学习之网络编程(纯理论)

写在前面 刚刚更新完Linux系统编程,特别推荐大家去看的Linux系统编程,总共44个小时,老师讲的非常好,我是十天肝完的,每天大概看20集,每天还要以写blog的形式来写笔记来总结一下,虽然这十天有点…

回顾2023,立2024flag

文章目录 回顾2023与CSDN相识专栏整理数据回顾 立2024flag 回顾2023 在过去的一年里,前端技术不断演进和创新。新技术、新框架层出不穷,给前端工程师提供了更多选择和挑战。2023年已经成为过去,回首这一年,我们也经历了许多挑战和…

C# Linq+ValueTuple(元祖),成为Linq高手!

文章目录 前言简单使用:能被2整除ValueTuple使用:两数相加等于4不使用元祖使用元祖排序 基于类的LinqGroupByJoinDistinct去重普通去重选择去重 集合去重ExceptIntersectUnion 总结 前言 Linq是C# 最强语法之一,和委托,get set并列(在我的心中)。我很早就听说了Lin…

rust异步实现(偏应用少理论不头疼版)

文章目录 1 添加依赖2 示例3 tokio异步实现机制概要 参考资料:( 想要进步理解可以看这个 ↓ ) https://www.bilibili.com/video/BV16r4y187P4/?spm_id_from333.788.recommend_more_video.1&vd_source20edf767ec72b97832bba2fc3aca50b8 R…

原型对象与对象原型,理解Function与Array和Object,在instanceof下的关联

面向过程与面向对象 面向过程时一步一步去做一件事,面向对象是多个功能组合在一起,去完成这件事。 面向对象的特性:继承性,封装性,多态性 通过概述应该知道面向过程和面向对象的优缺点 封装性 大家要玩游戏&#x…

如何使用手机公网远程访问本地群辉Video Station中视频文件【内网穿透】

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1.使用环境要求:2.下载群晖videostation&am…

三段低THD线性恒流控制芯片SM2256E:适用于印度球泡灯9W@230Vac

三段低THD线性恒流控制芯片SM2256E是一款专为印度球泡灯、GU10 LED 球泡灯、射灯、LED 蜡烛灯等设计的电子元件。它采用了先进的控制技术,实现了对电流的精准控制,从而有效地降低了总谐波失真(THD)。 SM2256E参数 该芯片的主要特…

蓝桥杯省赛无忧 STL 课件12 vector

01 vector的定义和特性 02 vector的常用函数 03 vector排序去重 示例&#xff1a; #include<bits/stdc.h> using namespace std; int main(){vector<int> vec {5,2,8,1,9};sort(vec.begin(),vec.end());for(const auto& num : vec){cout<<num<<&q…

Spring Boot自动装配

前言 自动装配是 Spring Boot 最核心的功能之一&#xff0c;第三方可以基于这个特性非常方便的和 Spring 做整合&#xff0c;实现自己的 Starter&#xff0c;做到开箱即用。 Java 早期并不支持注解&#xff0c;所以那会儿 Spring 只能通过 xml 的形式来配置。早期项目里要引入…

[Vulnhub靶机] DriftingBlues: 6

[Vulnhub靶机] DriftingBlues: 6靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues6_vh.ova 靶机地址&#xff1a;192.168.67.25 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …

分布式限流和本地限流那些事?

分布式限流和本地限流的目的是一样的&#xff0c;当然我建议技术人在自己的服务中优先考虑本地限流&#xff0c;那样对于自己的API的影响会小一点。 限流这种技术&#xff0c;在没有触发限流的阈值的时候&#xff0c;是不会有什么大的问题的&#xff0c;当时一旦触发阈值&…

在树莓派OS Bookworm中如何安装Python包

树莓派OS "Bookworm"版本&#xff0c;用于树莓派5上&#xff0c;更改了安装Python模块的方法。 关键要点&#xff1a; 1&#xff09;树莓派OS Bookworm需要在一个虚拟环境中安装Python包来防止与Python的系统版本发生冲突。 2&#xff09;你可以使用apt包管理器来搜…

如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问

文章目录 1. 拉取容器魔方镜像2. 运行容器魔方3. 本地访问容器魔方4. 群辉安装Cpolar5. 配置容器魔方远程地址6. 远程访问测试7. 固定公网地址 本文主要介绍如何在群辉7.2版本中使用Docker安装容器魔方&#xff0c;并结合Cpolar内网穿透工具实现远程访问本地网心云容器魔方界面…

商品源数据如何采集,您知道吗?

如今&#xff0c;电子商务已经渗透到了人们生活的方方面面。2020年新冠肺炎突如其来&#xff0c;打乱了人们正常的生产生活秩序&#xff0c;给经济发展带来了极大的影响。抗击疫情过程中&#xff0c;为避免人员接触和聚集&#xff0c;以“无接触配送”为营销卖点的电子商务迅速…

【数据结构】7大排序最详细

0.前言 接下来进入排序&#xff0c;我们知道在c语言阶段可能就学习过了像冒泡排序&#xff0c;选择排序这种比较简单的排序&#xff0c;那么接下来我们就会学习到更加高级的排序算法。但高级代表着难度的提升&#xff0c;但不用担心&#xff0c;博主会细细来谈&#xff0c;慢慢…

使用Rider C# Dll工程和Unity工程互相调用、断点方法

总体流程 创建C# Dll工程&#xff0c;生成C#工程Dll 创建Unity工程 Unity调用C#工程的代码 C#工程调用Unity工程的代码 断点方法 创建C# Dll工程&#xff0c;生成C#工程Dll 创建工程 选这个&#xff0c;注意UnityEngineDll这个选项&#xff0c;要选你目标unity版本的Dll…

【【深入浅出了解静态时钟分析和时钟约束】】

深入浅出了解静态时钟分析和时钟约束 时序分析是什么&#xff1f; 我们提出一些特定的时序要求&#xff08;或者说是添加特定的时序约束&#xff09;&#xff0c;使用特定的时序模型&#xff0c;针对特定的电路进行分析。分析的最终结果是要求系统时序满足我们提出的要求。 这…

MySQL的三种存储引擎 InnoDB、MyISAM、Memory

InnoDB 1). 介绍 InnoDB是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB是默认的MySQL 存储引擎。 2). 特点 DML操作遵循ACID模型&#xff0c;支持事务&#xff1b; 行级锁&#xff0c;提高并发访问性能&#xff1b; 支持外键F…

云渲染是什么?云渲染有什么用?云渲染对本地的渲染的影响有哪些?

如果你曾经在深夜加班&#xff0c;眼睁睁看着电脑显卡冒着烟、渲染器哭着喊着把你的CPU和GPU当成磨盘来使用&#xff0c;那么你可能会对云渲染心生向往。毕竟&#xff0c;谁不想在享用最新游戏画面和电影级效果的同时&#xff0c;不用忍受电脑发热、卡顿等问题呢&#xff1f; 云…

What does “grep -i“ do?

grep&#xff08; Global Regular Expression Print &#xff09;根据 给定的正则表达式 搜索文本&#xff0c;并将匹配的行打印出来 grep -i 表示查找的过程中忽略大小写 在已安装的rpm包里&#xff0c;查询是否有tree相关的包 rpm -qa | grep -i "tree"在文件中搜…