RabbitMQ学习笔记
1.消息中间件MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。常见的消息中间件1.ActiveMQ基于 JMS(Java Message Service)规范,Apache 开源项目。优点:标准兼容性好:完整支持 JMS 1.1/2.0 规范,适合 Java 企业级应用。功能全面:支持点对点(Queue)、发布订阅(Topic)、事务、持久化、集群等。协议丰富:除 OpenWire(默认)外,还支持 STOMP、AMQP、MQTT、WebSocket 等,便于多语言客户端接入。部署简单:单机模式配置轻量,适合中小型系统。缺点:性能一般:在高并发、高吞吐场景下性能不如 Kafka 或 RocketMQ。主从切换慢:传统主从模式故障恢复较慢(虽有 LevelDB + ZooKeeper 的共享存储方案,但已不推荐)。社区活跃度下降:新版本(如 ActiveMQ Artemis)虽有改进,但整体生态被 RabbitMQ/Kafka 超越。扩展性有限:横向扩展能力较弱,不适合超大规模消息堆积。📌适用场景:传统企业应用、低频异步解耦、需要 JMS 标准的 Java 系统。2.RabbitMQ基于 AMQP 0.9.1 协议,使用 Erlang 开发,强调可靠性与稳定性。优点:高可靠性:支持消息持久化、ACK 机制、死信队列、消息重试等,确保不丢消息。灵活路由:通过 Exchange + Binding + Routing Key 实现复杂路由策略(direct/topic/fanout/header)。管理界面友好:内置 Web UI,监控、运维、排错非常方便。社区成熟:文档丰富,插件生态完善(如延迟插件、Shovel、Federation)。多语言支持好:官方提供多种客户端 SDK。缺点:吞吐量中等:单机吞吐通常在万级 QPS,远低于 Kafka/RocketMQ。Erlang 门槛高:二次开发或深度定制困难,排查问题需了解 Erlang。内存占用高:大量未消费消息会占用较多内存(可调优)。集群扩展性一般:镜像队列(Mirroring)虽保证高可用,但写性能受主节点限制,无法水平扩展队列。📌适用场景:对消息可靠性要求高、业务逻辑复杂的系统(如金融、订单、支付)。3.RocketMQ阿里巴巴开源,后捐赠 Apache,为高吞吐、高可用、顺序消息而生。优点:高性能 高吞吐:单机可达 10w+ QPS,延迟低(毫秒级)。强顺序消息:支持严格 FIFO(分区有序),适用于交易流水、日志等场景。消息堆积能力强:基于磁盘文件存储,支持 TB 级消息堆积而不影响性能。丰富的特性:延迟消息(18个等级)、事务消息、消息轨迹、ACL 权限控制。天然分布式架构:NameServer(无状态) + Broker(主从) + Producer/Consumer,易于水平扩展。缺点:生态相对封闭:主要围绕 Java 生态,其他语言客户端支持较弱(虽有 Go/Python 社区版,但不如 Kafka 成熟)。运维复杂度较高:需维护 NameServer 和 Broker 集群,配置项较多。协议非标准:自定义协议,不兼容 JMS/AMQP,迁移成本高。社区国际化较弱:文档以中文为主,英文资料较少。📌适用场景:电商、金融、日志收集等对吞吐、顺序、堆积有高要求的场景。4.KafkaLinkedIn 开源,分布式流处理平台,强调高吞吐、可扩展、持久化日志。优点:超高吞吐量:单机可达数十万甚至百万级 QPS,适合大数据场景。极强扩展性:分区(Partition)机制天然支持水平扩展,消费者组可并行消费。持久化与回溯:消息持久化到磁盘,支持按 offset 任意回放(适用于数据管道、ETL)。生态系统强大:与 Flink、Spark、Hadoop、Kafka Streams 等无缝集成。跨语言支持好:社区提供丰富的客户端(Java/Go/Python/Node.js 等)。缺点:实时性稍差:为吞吐优化,默认批量发送/拉取,端到端延迟通常在 10ms~100ms(不适合强实时场景)。不支持复杂路由:只有 Topic + Partition,无 RabbitMQ 那样的灵活 Exchange。消息可靠性需调优:默认配置可能丢消息(需设置acks=all,replication.factor≥3等)。运维复杂:依赖 ZooKeeper(Kafka 2.8+ 支持 KRaft 模式去 ZooKeeper,但尚未完全普及)。📌适用场景:日志聚合、行为追踪、流式处理、大数据管道、事件溯源等。Kafka:适合大数据处理、流计算场景,以及对吞吐量和持久化有极高要求,并且愿意投入资源进行运维的项目。ActiveMQ:适用于小型项目或对消息队列功能需求较简单的场景,由于社区活跃度不高,不推荐使用。RabbitMQ:在需要灵活路由、广泛语言支持及良好社区生态的项目中表现出色,适用于大多数通用应用场景。RocketMQ:尤其适合金融、电商等对性能和事务处理要求严苛,愿意投入精力学习和维护的大型分布式系统。2.RabbitMQ简介RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:http://www.rabbitmq.com/RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);官网对应模式介绍:https://www.rabbitmq.com/getstarted.html安装成功后,在sbin目录下cmd执行rabbitmq-plugins enable rabbitmq_management启动管理功能默认账号密码 guest1.导入依赖!--amqp-client-- !-- Source: https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -- dependency groupIdcom.rabbitmq/groupId artifactIdamqp-client/artifactId version5.21.0/version scopecompile/scope /dependency2.编写连接工具类public class ConnectionUtil { public static Connection getConnection() throws IOException, TimeoutException { // 1.创建连接工厂 ConnectionFactory connectionFactory = new ConnectionFactory(); // 2.配置连接信息 connectionFactory.setHost("localhost"); // ip connectionFactory.setPort(5672); // 端口 connectionFactory.setVirtualHost("/"); // 虚拟机 connectionFactory.setUsername("admin"); // 用户名 connectionFactory.setPassword("admin"); // 密码 // 3.创建连接 return connectionFactory.newConnection(); } }1.简单模式简单模式(Simple/Hello World):一个生产者发送消息到一个队列,一个消费者从该队列接收消息,是最基本的点对点通信模型。编写生产者public class Producer { ​ private static final String QUEUE_NAME = "simple_queue"; ​ public static void main(String[] args) throws IOException, TimeoutException { // 1.获取连接对象 Connection connection = ConnectionUtil.getConnection(); ​ // 2.创建频道 Channel channel = connection.createChannel(); /* * 声明(创建)队列 * 参数1:队列名称 * 参数2:是否定义持久化队列:true(是),false(否) 保存到硬盘 * 参数3:是否独占本次连接:true(是),false(否) 只能被当前连接使用,如果connection连接关闭,则队列自动删除 * 参数4:是否在不使用的时候自动删除队列 * 参数5:队列其它参数 以Map数据结构存储 */ channel.queueDeclare(QUEUE_NAME,true,false,false,null); ​ // 3.发送消息 String message = "Hello RabbitMQ3"; /* * 参数1:交换机名称,如果没有指定则使用默认Default Exchage * 参数2:路由key,简单模式可以传递队列名称 * 参数3:消息其它属性 * 参数4:消息内容 */ channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); ​ // 4.关闭资源 channel.close(); connection.close(); } }编写消费者public class Consumer { ​ private static final String QUEUE_NAME = "simple_queue"; ​ public static void main(String[] args) throws IOException, TimeoutException { // 1.获取连接对象 Connection connection = ConnectionUtil.getConnection(); ​ // 2.创建频道 Channel channel = connection.createChannel(); /* * 声明(创建)队列 * 参数1:队列名称 * 参数2:是否定义持久化队列:true(是),false(否) 保存到硬盘 * 参数3:是否独占本次连接:true(是),false(否) 只能被当前连接使用,如果connection连接关闭,则队列自动删除 * 参数4:是否在不使用的时候自动删除队列 * 参数5:队列其它参数 以Map数据结构存储 */ channel.queueDeclare(QUEUE_NAME, true, false, false, null); ​ // 3.创建消费者

相关新闻

YOLO26手势识别项目实战1-石头剪刀布实时检测系统数据集说明(含下载链接)

YOLO26手势识别项目实战1-石头剪刀布实时检测系统数据集说明(含下载链接)

一. 前言 本篇博客是《YOLO26手势识别项目实战》系列文章之《石头剪刀布数据集说明(含下载链接)》,网上有很多石头剪刀布数据集的数据,百度一下,一搜一大堆,但质量参差不齐,很多不能用,即使一个一个的看也…

2026/7/3 16:49:12 阅读更多 →
YOLO26手势识别项目实战2-石头剪刀布实时检测系统数据集说明(含训练代码和数据集)

YOLO26手势识别项目实战2-石头剪刀布实时检测系统数据集说明(含训练代码和数据集)

YOLO26手势识别项目实战2-石头剪刀布实时检测系统,其能识别检测出3种手势手语:names: [Rock,Paper,Scissors] 具体图片见如下: 第一步:YOLO26介绍 YOLO26采用了端到端无NMS推理,直接生成预测结果,无需非极…

2026/7/3 16:49:11 阅读更多 →
三极管信号放大电路的应用

三极管信号放大电路的应用

目录 一、 信号放大类 1、低频电压放大 Multisim仿真分析 2、高频信号放大 Multisim仿真分析 3、缓冲与阻抗匹配 Multisim仿真分析 摘要 三极管在电子电路中有两大核心应用:开关和放大。放大应用主要通过共射、共基、共集三种组态实现信号放大,其中共射组态适用于低频…

2026/7/3 16:49:11 阅读更多 →

最新新闻

深入pytest_collection_modifyitems钩子:定制化测试用例执行与调度

深入pytest_collection_modifyitems钩子:定制化测试用例执行与调度

1. 项目概述如果你在用pytest做自动化测试,尤其是项目规模稍微大一点,或者对测试报告、用例执行顺序有特殊要求时,你大概率会碰到一个绕不开的“神器”——pytest_collection_modifyitems钩子函数。我第一次深入使用它,是因为一个…

2026/7/3 22:17:57 阅读更多 →
DVWA从入门到精通(八):SQL Injection(SQL注入)

DVWA从入门到精通(八):SQL Injection(SQL注入)

摘要:本文是《DVWA从入门到精通》系列的第八篇,带你全面掌握SQL Injection(SQL注入)模块的攻防全流程。从SQL注入的核心原理出发,逐步讲解Low、Medium、High三个级别的攻击手法与源码分析,并深入探讨Imposs…

2026/7/3 22:17:57 阅读更多 →
基于PIC18F4685与KMR221的高精度电压管理系统设计

基于PIC18F4685与KMR221的高精度电压管理系统设计

1. 项目概述:基于KMR221与PIC18F4685的电压管理系统在嵌入式系统设计中,精确的电压管理一直是硬件工程师面临的挑战。传统方案往往需要复杂的分立元件组合,而现代微控制器与专用电源管理芯片的协同工作正在改变这一局面。这次我要分享的&…

2026/7/3 22:15:57 阅读更多 →
【Bug已解决】Anthropic tool_result 找不到对应 tool use id 解决方案

【Bug已解决】Anthropic tool_result 找不到对应 tool use id 解决方案

【Bug已解决】Anthropic tool_result 找不到对应 tool use id 解决方案 1. 问题描述 在自己动手用 Anthropic Messages API 搭建 Agent Harness、实现多轮工具调用循环时,很多人会在某一次请求时遇到这样的 400 错误: {"type": "error&qu…

2026/7/3 22:13:56 阅读更多 →
Linux下fastai第一课完整实操:PyTorch+CUDA+Jupyter环境从零搭建

Linux下fastai第一课完整实操:PyTorch+CUDA+Jupyter环境从零搭建

1. 项目概述:在Linux系统上扎实走完fastai第一课的完整实操路径我带过不少从零开始学深度学习的朋友,发现一个特别普遍的现象:很多人卡在“环境跑不起来”这一步,不是报错就是版本冲突,最后对着Jupyter Notebook里那一…

2026/7/3 22:11:56 阅读更多 →
双检测时代论文修改怎么选?10 款主流降重复降 AIGC 工具分层测评,paperxie 领跑定稿适配赛道

双检测时代论文修改怎么选?10 款主流降重复降 AIGC 工具分层测评,paperxie 领跑定稿适配赛道

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图降重复率 - PaperXie智能写作PaperXie免费论文查重检测-首款免费论文检测软件,为毕业生提供专业的论文重复率检测、论文降重、Aigc检测、智能排版 、论文写作等一站式服务。https://www.paperxie.c…

2026/7/3 22:11:56 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻