【从零开始学习RabbitMQ | 第一篇】从异步通信到交换机

news2025/7/15 18:41:41

目录

前言

1.什么是RabbitMQ?

2.同步调用的优缺点

3.异步调用的优缺点

3.1优点:

3.2异步调用的问题是什么?

4技术选型

4.1AMQP协议就是:

4.2kafka和RabbitMQ的使用场景

5.安装RabitMq

6.rabitmq的整体架构 

7.RabibtMQ的快速入门

7.1小结:

8.数据隔离

9.任务模型workqueue

10.Fanout交换机

总结


前言

这是我学习RabbitMQ总结的笔记,RabbitMQ是很强大的消息队列组件,是学习java路上不可缺少的一部分,越学越觉得自己无知,继续加油,欢迎大家阅读本文!!相信阅读后大家可以对RabbitMQ有简单的认识

1.什么是RabbitMQ?

RabbitMQ 是一个开源的消息代理软件(有时也被称为面向消息的中间件),它实现了高级消息队列协议(AMQP),在分布式系统中扮演着重要的角色。可以使用mq实现异步通信

2.同步调用的优缺点

  • 优点:
  • 时效性强,等待到结果才会返回

  • 缺点:
  • 可拓展性差,每次都需要修改各个模块的代码
  • 性能下降
  • 级联失败问题

3.异步调用的优缺点

  1. 异步调用通常是基于消息通知的方式,包含三个角色:
  2. 消息发送者:投递消息的人,就是原来的调用者
  3. 消息接收者:接收和处理消息的人,就是原来的服务提供者
  4. 消息代理:管理、暂存、转发消息,你可以把它理解成微信服务器,或者是一个中转站

  • 消息发送者
  • 消息代理:一般是消息队列这里使用RabitMQ 就是broker
  • 消息接收者

3.1优点:

  1. 解除耦合,拓展性强
  2. 无需等待,性能好
  3. 故障隔离
  4. 缓存消息,流量削峰填谷(常见的场景就比如抖音卖货321开始抢单,只有在那一会并发量较大,需要处理的流量多,而其他时候流量却很少,这时候流量就像山峰和山谷,消息队列可以实现流量的削峰填谷,实现流量的相对平稳被服务器处理)

3.2异步调用的问题是什么?

  1. 不能立即得到调用结果,时效性差
  2. 不确定下游业务执行是否成功
  3. 业务安全依赖于Broker的可靠性

我们在选择消息队列的时候尽量要选择安全性可靠性高的消息队列,如果消息队列一出现问题,那么我们的消息全部丢失,这时候如果是一些支付消息,那就很糟糕了

4技术选型

市场上有许多的消息队列供我们选择,这里我们分析各个消息队列的优缺点

4.1AMQP协议就是

AMQP(Advanced Message Queuing Protocol)协议是一个开放标准的应用层协议,专为在分布式系统中实现可靠的消息传递和异步通信而设计。它定义了一套详细的规范,涵盖了消息的创建、发布、路由、接收以及确认等各个环节,确保消息能够在不同的应用程序或系统之间准确无误地传输,并且支持多种消息传递模式,如点对点、发布/订阅等,以满足不同业务场景的需求。同时,AMQP协议还具有良好的可扩展性和互操作性,允许不同的实现之间进行无缝集成和通信。(也就是不区分编程语言)

  1. 消息队列就是我们进行异步调用模型的消息代理,broker
  2. kafka的单机吞吐量非常之高,可以达到几百万每秒,适合做一些大数据处理
  3. RocketMq单机吞吐量可以达到10w以上
  4. RabbitMQ一般在10w一下

4.2kafka和RabbitMQ的使用场景

可以看一下我之前写的csdn分析过

点我

支持镜像集群,可用性高

5.安装RabitMq

这里使用docker安装更加方便

之前有写过docker的安装教程点我

docker run \
 -e RABBITMQ_DEFAULT_USER=itheima \    用户名
 -e RABBITMQ_DEFAULT_PASS=123321 \   密码
 -v mq-plugins:/plugins \   数据卷挂载
 --name mq \    容器名字
 --hostname mq \  主机名字
 -p 15672:15672 \   客户端端口
 -p 5672:5672 \     接受信息端口
 --network hm-net\  网络
 -d \
 rabbitmq:3.8-management

6.rabitmq的整体架构 

这里我们就可以知道消息发送者将消息发送给交换机,然后根据交换机的不同类型,不同策略去将消息发送给我们的队列,然后再由我们的消费者去消费。

交换机有不同类型目前刚学到Fanout(广播)

7.RabibtMQ的快速入门

在学习一门技术我们一般可以先去学习如何使用,快速入门,然后根据功能逐步扩展,这里我们选择快速入门实践我们的RabbitMQ

rabitmq客户端的地址。这里是我的虚拟机地址

绑定了两个队列

发送消息

rabitMq的客户端的功能相当全面,我们可以查看我们发送的消息,而不用消费者

7.1小结:

交换机只能进行路由消息无法存储消息,如果我们没有给交换机绑定消息队列,那么我们的消息就会丢失,因此必须进行交换机绑定

8.数据隔离

我们在开发的时候往往希望不同的业务和项目再使用我们的mq服务时候,数据数据是隔离的,因此我们会采取给不同的业务和项目赋予不同的用户,然后再给用户赋予不同的虚拟主机,以此来实现数据隔离

9.任务模型workqueue

workqueue:可以加快我们消费者消费的速度,就比如在一些高并发场景下我们可以让多个消费者去同时监听一个队列,可以解决消息堆积问题

可以简单的去模拟我们的任务模型在java当中

生产者

消费者

默认采取轮询的策略,为了实现能者多劳,我们可以修改配置,如下

workqueue任务模型

  1. 多个消费者绑定到一个队列,可以加快消息处理速度
  2. 同一条消息只会被一个消费者处理
  3. 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

10.Fanout交换机

交换机的作用主要是接收发送者发送的消息,并将消息路由到与其绑定的队列。

常见交换机的类型有以下三种:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

fanout交换机是广播,每一个与其绑定的queue都可以接收消息,所以也叫广播模式

可以看一下代码的简单实现。

消费者

生产者

总结

RabbitMQ 是一款开源的消息代理软件,实现了 AMQP 协议,在分布式系统异步通信中发挥关键作用。与同步调用相比,异步调用借助消息发送者、接收者和 RabbitMQ 这样的消息代理,虽然牺牲了时效性、难以确定业务执行状态且依赖代理可靠性,但具备解除耦合、提升性能、隔离故障以及流量削峰填谷等优势。在技术选型上,RabbitMQ 单机吞吐量一般在 10w 以下,相比 Kafka 的数百万每秒、RocketMQ 的 10w 以上,更适用于对可用性要求高的场景。通过 Docker 可便捷安装 RabbitMQ,其架构中交换机负责消息路由,如 Fanout 交换机采用广播模式将消息分发至所有绑定队列。使用时,交换机必须绑定队列以防止消息丢失,还可通过用户和虚拟主机实现数据隔离;workqueue 任务模型支持多消费者绑定同一队列加速消息处理,通过设置 prefetch 实现能者多劳 。

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

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

相关文章

AI(学习笔记第二课) 使用langchain进行AI开发

文章目录 AI(学习笔记第二课) 使用langchain进行AI开发学习内容:1. 使用背景2.创建python(pycharm community版)开发环境并连接deepseek2.1 创建python(pycharm community版)开发环境2.2 创建python工程2.3 写入初始py…

基于Jenkins的DevOps工程实践之Jenkins共享库

文章目录 前言Jenkins共享库结构1、共享库演示2、知识点补充3、实践使用共享库格式化输出日志4、groovy基础语法4.1、 什么是 Groovy?4.2、groovy特点4.3、运行方法4.4、标识符4.5、基本数据类型4.5.1、string类型4.5.2、list类型 4.6、函数使用4.7、正则表达式 5、…

使用Qt自带的Qt assistant时如何添加需要查看的文档

当我们双击打开Qt Assistant时 左边目录栏只有自带的帮助文档,所以需要添加要查看的文档 点击左上角Edit中的Preferences,点击add 找到qdoc文件夹 全选里面的内容 点击Apply 点击ok 左边的目录栏就出现所有这个版本的Qt有关的文档啦

基于网络爬虫+Spark+Hadoop等大数据和SpringBoot技术实现的的汽车行业大数据分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…

日本IT|AI应用工程师主要工作内容以及职业前景解析

1. 主要工作内容 AI应用工程师是: 类别具体工作内容常见工具需求分析和业务部门沟通,明确「用AI解决什么问题」PowerPoint, Excel, Miro模型选型与微调用现成AI(如BERT、YOLOv8、Stable Diffusion等)做Fine-TuningPython (PyTor…

Soft Mask(软遮罩)技术

一、概述 Soft Mask是一种技术或工具,主要用于实现平滑的边缘遮罩效果。它在不同的应用领域有不同的实现和定义 1.在Unity UI设计中 SoftMask是一款专为Unity设计的高级遮罩工具,它突破了传统Mask的限制,提供了更为灵活和细腻的UI遮罩解决方案…

ESP32开发之freeRTOS的互斥量

什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量 在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。 比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然…

K8s 资源分类

K8s 资源分类图谱 内置资源的分类 1、工作负载相关: Pod:最小的部署单元,包含一个或多个容器。 Deployment:管理无状态应用的副本和滚动更新。 StatefulSet:适用于有状态应用(如数据库)&#…

基于 Flask的深度学习模型部署服务端详解

基于 Flask 的深度学习模型部署服务端详解 在深度学习领域,训练出一个高精度的模型只是第一步,将其部署到生产环境中,为实际业务提供服务才是最终目标。本文将详细解析一个基于 Flask 和 PyTorch 的深度学习模型部署服务端代码,帮…

【金仓数据库征文】金仓数据库 KES:MySQL 迁移实用指南

我们都知道,现在企业数字化转型那可是势在必行,数据库迁移这事儿就变得特别关键。金仓数据库的 KingbaseES(简称 KES),就给咱从 MySQL 往 KES 迁移数据库提供了一套超好用的方案。下面咱就讲下 咋用金仓数据库来完成这…

多态(c++详细版)

一.多态 1.1 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时多态(静态多态)主…

数据结构——二叉树和堆(万字,最详细)

目录 1.树 1.1 树的概念与结构 1.2 树相关的术语 1.3 树的表示法 2.二叉树 2.1 概念与结构 2.2 特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.3 二叉树存储结构 2.3.1 顺序结构 2.3.2 实现顺序结构二叉树 2.3.2.1 堆的概念与结构 2.3.2. 2 堆的插入与删除数据…

MATLAB基于格拉姆角场与2DCNN-BiGRU的轴承故障诊断模型

本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0 引言 1 格拉姆角场原理 2 2DCNN-BiGRU网络结构 3 应用实例 3.1 数据准备 3.2 格拉姆角场数据提取 3.3 网络模型搭建-重中之重 3.4 …

正点原子IMX6U开发板移植Qt时出现乱码

移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法,方便自己日后回顾,也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后,sd卡里已经存储了Qt的各种库&…

JVM局部变量表和操作数栈的内存布局

局部变量表和操作数栈 首先看一段Java源码 public class Add_Sample{public int add(int i, int j){int k 100;int result i j k;return result;}public static void main(String[] args){int result new Add_Sample().add(10,20);System.out.println(result);} }使用ja…

Mockoon 使用教程

文章目录 一、简介二、模拟接口1、Get2、Post 一、简介 1、Mockoon 可以快速模拟API,无需远程部署,无需帐户,免费,跨平台且开源,适合离线环境。 2、支持get、post、put、delete等所有格式。 二、模拟接口 1、Get 左…

使用 IDEA + Maven 搭建传统 Spring MVC 项目的详细步骤(非Spring Boot)

搭建Spring MVC项目 第一步:创建Maven项目第二步:配置pom.xml第三步:配置web.xml第四步:创建Spring配置文件第五步:创建控制器第六步:创建JSP视图第七步:配置Tomcat并运行目录结构常见问题解决与…

3.2.3 掌握RDD转换算子 - 4. 按键归约算子 - reduceByKey()

在本节课中,我们深入学习了Spark RDD的reduceByKey()算子。reduceByKey()主要用于处理元素为(key, value)形式的RDD,能够将相同key的元素聚集并合并,最终返回一个新RDD,其元素类型与原RDD保持一致。通过案例演示,我们首…

Pandas比MySQL快?

知乎上有人问,处理百万级数据,Python列表、Pandas、Mysql哪个更快? Pands是Python中非常流行的数据处理库,拥有大量用户,所以拿它和Mysql对比也是情理之中。 实测来看,MySQL > Pandas > Python列表…

简易的考试系统设计(Web实验)

简易的考试系统设计(Web实验) 1.实验内容与设计思想(一)实验需求(二)设计思路 2.代码展示3.实验小结 1.实验内容与设计思想 (一)实验需求 1.编写两个页面程序,一个HTML…