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

目录

前言

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.mzph.cn/news/904728.shtml

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

相关文章

Dify MCP实战 - 邮件发送

安装MCP sse插件 配置MCP Server 由于Dify 目前还没有支持stdio方式连接MCP Server。我们找到了Zapier,轻松调用 7000 App 工具。 Zapier配置 • 访问 https://actions.zapier.com/settings/mcp/ • 添加Gmail Send Email工具 • 授权自己的Gmail邮箱 • 复制Za…

uniapp 微信小程序使用图表

使用的是秋云 ucharts 直接在hbuilder插件市场进行下载导入项目中,多端支持 下载地址秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场 导入成功后这里就能看到导入的插件啦 导入项目后就可以直接在页面中通过组件使用了 不需要其余配置 使用简单 参…

Python数据脱敏技术在大模型机器学习中的深度应用与实践

一、数据脱敏技术体系详解 1.1 结构化数据脱敏技术 1.1.1 列级脱敏策略 import pandas as pd from faker import Fakerclass StructuredDataMasker:def __init__(self):self.faker =

【设计模式】GoF设计模式之策略模式(Strategy Pattern)

设计模式之策略模式 Strategy Pattern V1.0核心概念角色代码示例程序运行结果代码讲解 适用范围 V1.0 核心概念 策略模式是一种行为型设计模式,其核心思想是业务类执行某个动作时,可以使用该动作的不同的实现,并在程序运行中可以切换使用该…

VS Code配置指南:打造高效的QMK开发环境

VS Code配置指南:打造高效的QMK开发环境 前言 你是否曾为QMK固件开发环境的搭建而头疼不已?本文将手把手教你使用Visual Studio Code(简称VS Code)这款强大的代码编辑器来构建一个完美的QMK开发环境,让你的键盘固件开…

java CompletableFuture 异步编程工具用法1

1、测试异步调用: static void testCompletableFuture1() throws ExecutionException, InterruptedException {// 1、无返回值的异步任务。异步线程执行RunnableCompletableFuture.runAsync(() -> System.out.println("only you"));// 2、有返回值的异…

中国自动驾驶研发解决方案,第一!

4月28日,IDC《中国汽车云市场(2024下半年)跟踪》报告发布,2024下半年中国汽车云市场整体规模达到65.1亿元人民币,同比增长27.4%。IDC认为,自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板,推动云计算在…

如何快速获取字符串的UTF-8或UTF-16编码二进制数据?数值转换成字符串itoa不是C标准?其它类型转换成字符串?其它类型转换成数值类型?

目录 如何快速获取字符串的UTF-8或UTF-16编码二进制数据? 数值转换成字符串itoa不是C标准? 其它类型转换成字符串 其它类型转换成数值类型 转换成数值的API 为什么有的编程语言允许字符串和整数相加? 字符串拼接 字符串字面量自动连接 如何快速获取字符串…

Android SDK 国内镜像及配置方法(2025最新,包好使!)

2025最新android sdk下载配置 1、首先你需要有android sdk manager2、 直接上教程修改hosts文件配置域名映射即可(不用FQ)2.1 获取ping dl.google.com域名ip地址2.2 配置hosts文件域名映射2.3 可以随意下载你需要的sdk3、 总结:走过弯路,踩过坑!!!大家就不要踩了!避坑1…

MySQL事务隔离机制与并发控制策略

MySQL事务隔离机制与并发控制策略 MySQL事务隔离机制与并发控制策略一、数据库并发问题全景解析二、事务隔离级别深度解析三、MySQL并发控制核心技术1. 多版本并发控制(MVCC)2. 锁机制 四、隔离级别实现差异对比五、生产环境最佳实践六、高级优化技巧七、…

Python `zip()` 函数是什么

Python zip() 函数是什么 在 Python 里,zip() 是一个内置函数,其主要作用是将多个可迭代对象(像列表、元组、字符串等)中的元素一一对应地组合成元组,最终返回一个迭代器,这个迭代器会生成这些元组。 基本语法 zip(*iterables)其中,*iterables 代表可变数量的可迭代对…

Jenkins 改完端口号启动不起来了

让我们将 Jenkins 恢复到默认的 8080 端口,确保它能正常启动: 1. 修改 Jenkins 的配置文件: sudo nano /etc/default/jenkins 将内容修改为: HTTP_PORT8080 JENKINS_ARGS"--webroot/var/cache/jenkins/war --httpPort8080…

【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例

前言 自学笔记,解决问题为主,亲测有效,欢迎补充。 本地WP文件部署到AWS整体步骤如下:(本文重点:AWS准备完成) 0. [AWS 准备] 注册 AWS 并创建 EC2 实例 ↓ 1. [生成安装包:用 Du…

使用pytorch保存和加载预训练的模型方法

需要使用到的函数 在 PyTorch 中,torch.save() 和 torch.load() 是用于保存和加载模型的核心函数。 torch.save() 函数 主要用途:将模型或模型的状态字典(state_dict)保存到文件中。 语法: torch.save(obj, f, pi…

Python从入门到高手8.3节-元组的常用操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 祈祷明天不再打雷下雨 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法,在本节的内容中,着重介绍元组类型的操作方法。 ​ 元组是…

图书推荐(协同过滤)算法的实现:基于订单购买实现相似用户的图书推荐

代码部分 package com.ruoyi.system.service.impl;import com.ruoyi.system.domain.Book; import com.ruoyi.system.domain.MyOrder; import com.ruoyi.system.mapper.BookMapper; import com.ruoyi.system.mapper.MyOrderMapper; import com.ruoyi.system.service.IBookRecom…

JMeter快速指南:命令行生成HTML测试报告(附样例命令解析)

一、核心命令解析 jmeter -g Dash_CapacityTest_01_AllModules_1000.jtl -o report/ 参数 作用 示例文件说明 -g 指定.jtl结果文件路径 -o 指定报告输出目录 自动创建report文件夹 二、操作步骤(Windows/Linux/Mac通用) 进入JMe…

2025年渗透测试面试题总结-渗透岗位全职工作面试(附回答)(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、通用基础类问题 1. 自我介绍 2. 职业动机与规划 3. 加班/出差接受度 二、安全技术类问题 1. 漏…

使用DEEPSEEK快速修改QT创建的GUI

QT的GUI,本质上是使用XML进行描述的,在QT CREATOR的界面编辑处,按CTRL2 切换到代码视图,CTRL3切换到编辑器视图。 CTRL2 切换到代码视图 CTRL3 切换到编辑器视图 鼠标左键点击代码视图中,按CTRLA → CTRLC复制XML代码…

draw.io流程图使用笔记

文章目录 图形较少的问题安装版好还是非安装版好业务系统嵌入的draw.io如何导入呢?如何判断组合和取消组合如何快速选中框里面的内容有时候选不到文本怎么办连接线如何不走直角 航点和取消航点支持多少种图形多个连接点?多个图形对齐双向箭头如何画图形的大小 其他流程图图标…