RabbitMQ的原理和集成使用

RabbitMQ 是一个消息代理系统,支持多种消息传递协议,主要用于解耦和异步处理。作为 AMQP(Advanced Message Queuing Protocol)协议的实现,它在现代分布式系统中有广泛应用,尤其在微服务架构中。以下是 RabbitMQ 的原理、组件、消息模型、应用场景和 Spring Boot 集成方法。


一、RabbitMQ 基本原理

RabbitMQ 基于 AMQP 协议,消息从生产者发送到交换机(Exchange),然后路由到队列(Queue),并最终被消费者消费。消息经过持久化、确认、重试等机制,保证消息的可靠投递。


二、RabbitMQ 的核心组件

  1. Producer(生产者):发送消息的应用程序。
  2. Consumer(消费者):接收并处理消息的应用程序。
  3. Exchange(交换机):接收生产者发送的消息,并根据路由规则将消息转发到队列。RabbitMQ 支持四种交换机类型:
    • Direct:精确路由交换机,消息会发送到与路由键精确匹配的队列。
    • Fanout:广播交换机,消息会分发到所有绑定的队列,忽略路由键。
    • Topic:主题交换机,支持模糊匹配的路由键,适合模式匹配。
    • Headers:基于消息头的交换机,路由依据消息头中的键值对而非路由键。
  4. Queue(队列):存储消息的队列,消息在此等待被消费者消费。
  5. Binding(绑定):交换机与队列之间的关联关系,包含路由规则。
  6. Routing Key(路由键):消息的路由标识,帮助交换机将消息投递到匹配的队列。
  7. Virtual Host(虚拟主机):类似于命名空间,用于资源隔离。
  8. Connection(连接)和 Channel(信道):生产者和消费者通过 TCP 连接 RabbitMQ 服务,Channel 是建立在连接上的逻辑通道,多条通道共享一个 TCP 连接。

三、消息投递保证机制

  1. 消息持久化:消息可以持久化存储在磁盘中,即使服务器重启,消息也不会丢失。
  2. 消息确认机制(ACK):消费者确认收到消息后 RabbitMQ 才会将其删除;若消息处理失败,可进行重发。
  3. 消息重试与死信队列:消息处理失败后,RabbitMQ 可以重试发送,超过重试次数的消息进入死信队列(Dead Letter Queue)。

四、RabbitMQ 的消息模型

RabbitMQ 的消息模型基于交换机、队列和路由键的组合,通过不同的交换机类型实现灵活的消息投递。

  1. 简单队列模式:一个生产者对应一个消费者,消息直接发送到队列,适合简单的消息传递场景。
  2. 工作队列模式:一个生产者对应多个消费者,消费者按轮询方式消费队列中的消息,实现负载均衡。
  3. 发布订阅模式(Fanout):广播消息,多个消费者接收同一条消息,适合发布订阅模式。
  4. 路由模式(Direct):通过路由键将消息路由到指定队列,实现特定的消息投递。
  5. 主题模式(Topic):使用通配符路由键,实现模糊匹配的消息投递,适合复杂的多级分类场景。

五、RabbitMQ 的应用场景

  1. 异步处理:将耗时任务(如邮件发送、图片处理)放入消息队列,由消费者异步执行。
  2. 微服务通信:在分布式系统中,RabbitMQ 用于不同微服务间的消息通信,降低系统耦合度。
  3. 削峰填谷:通过消息队列控制请求流量,避免流量过高导致系统崩溃,适合高并发的场景。
  4. 任务调度:将任务按时间顺序发送到队列,实现任务的顺序执行或定时任务。

六、RabbitMQ 与 Spring Boot 集成

Spring Boot 提供了 spring-boot-starter-amqp 依赖包,简化了 RabbitMQ 的使用。以下是一个基本的集成示例。

6.1 引入依赖

pom.xml 中添加 RabbitMQ 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
6.2 配置 RabbitMQ

application.yml 文件中配置 RabbitMQ 连接信息:

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
6.3 定义配置类

配置队列、交换机和绑定关系:

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {public static final String QUEUE_NAME = "example-queue";public static final String EXCHANGE_NAME = "example-exchange";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME, true);}@Beanpublic TopicExchange exchange() {return new TopicExchange(EXCHANGE_NAME);}@Beanpublic Binding binding(Queue queue, TopicExchange exchange) {return BindingBuilder.bind(queue).to(exchange).with("routing.key.#");}
}
6.4 生产者(Producer)

创建消息生产者发送消息到 RabbitMQ:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class MessageProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, "routing.key.example", message);}
}
6.5 消费者(Consumer)

使用 @RabbitListener 注解创建消费者来监听队列中的消息:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class MessageConsumer {@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)public void receiveMessage(String message) {System.out.println("Received message: " + message);}
}
6.6 启动和测试

在启动 Spring Boot 项目后,调用 MessageProducersendMessage 方法发送消息,MessageConsumer 会监听队列并接收消息。


七、RabbitMQ 高级特性

  1. 消息确认机制
    • RabbitMQ 支持手动和自动消息确认。手动确认可以避免消息丢失,即在消息成功处理后再确认。
  2. 消息重试与死信队列
    • 消费者拒绝处理的消息可以进入死信队列,实现消息重试机制。
  3. 消息延迟
    • 可以使用 TTL(Time to Live)设置消息的过期时间,或使用插件实现延迟消息投递。
  4. 优先级队列
    • 可以给队列设置消息优先级,让高优先级消息优先消费。
  5. 集群模式
    • RabbitMQ 支持多种集群模式,可以实现高可用和高扩展性。

八、总结

RabbitMQ 作为消息队列系统,在微服务系统中能很好地实现异步处理、负载均衡和解耦。通过与 Spring Boot 集成,可以轻松地使用 RabbitMQ 的基本功能和高级特性,适用于消息通知、任务调度等场景。

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

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

相关文章

Rust 力扣 - 643. 子数组最大平均数 I

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的最大和即可&#xff0c;遍历过程中刷新最大值 结果为窗口长度为k的最大和 除以 k 题解代码 impl Solution {pub fn find_max_average(nums: Vec<…

Vscode使用launch.json进行传参调试代码

目录 1 操作2 后记 1 操作 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus&#xff0c;并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

#渗透测试#SRC漏洞挖掘#自动化脚本的编写01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

python 使用进程池并发执行 SQL 语句

这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理&#xff0c;绕过 Python 的全局解释器锁&#xff08;GIL&#xff09;限制&#xff0c;从而在多核 CPU 上并发执行多个 SQL 语句。 from pyhive import hive import multiprocessing# 建立连接 conn hive.…

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

电子电气架构 --- 车载诊断的快速入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

继承的内容

封装&#xff1a; 1.在类中&#xff0c;把数据和方法放在一起&#xff0c;只展示成员函数&#xff0c;不展示定义的数据为私有。 2.一个类型放到另一个类型里面&#xff0c;通过typedef成员函数调整&#xff0c;封装另一个全新的类型。相当于是一个包装。 继承&#xff1a; st…

设计模式之结构型模式---装饰器模式

目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

接口测试(十一)jmeter——断言

一、jmeter断言 添加【响应断言】 添加断言 运行后&#xff0c;在【察看结果树】中可得到&#xff0c;响应结果与断言不一致&#xff0c;就会红色标记

vue-i18n国际化多国语言i18n国际语言代码对照表

uniapp是自带有i18n这个插件 需要自己去给每一个需要国际化的字符去手动配置key&#xff0c;所以如果是已经完成的项目可能工作量就稍微有点大了 第一步&#xff1a; 语言命名是有规范的不能乱取名&#xff0c;具体可以参考国际语言代码 i18n国际语言代码对照表 zh_CN 中文(简体…

GitHub | 发布到GitHub仓库并联文件夹的方式

推送到Github 推送步骤如果你只想更新单个文件&#xff0c;只需在第 4 步中指定该文件的路径即可。可能问题一 效果 推送步骤 更新 GitHub 仓库中的文件通常涉及以下步骤&#xff1a; 克隆仓库&#xff1a; 首先&#xff0c;你需要将 GitHub 上的仓库克隆到本地。使用 git …

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

杂货 | 每日资讯 | 2024.11.1

注意&#xff1a;以下内容皆为AI总结 2024年11月1日&#xff0c;人工智能&#xff08;AI&#xff09;领域发生了多项重要事件&#xff0c;标志着技术发展的新阶段。本文将详细探讨以下三大事件&#xff1a; OpenAI为ChatGPT新增搜索功能IEEE发布《2025年及以后的技术影响》报…

RuoYi 样例框架运行步骤(测试项目自用,同学可自取)

目录 后台 API 运行导入&#xff0c;下载包端口号mysql 准备运行 PC&#xff08;电脑端&#xff09;运行安装 nodejs安装 yarn 及其依赖&#xff0c;启动服务登录admin(admin123) 或 ry(admin123) App&#xff08;移动&#xff09;运行下载 HBuilderX运行app运行注意&#xff1…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

项目解决方案:跨不同的物理网络实现视频监控多画面的实时视频的顺畅访问

目录 一、碰到的需求问题 二、需求分析 三、方案分析 &#xff08;一&#xff09;方法1&#xff1a;使用HTTP代理 1. 安装HTTP代理服务器 2. 配置Nginx代理 3. 重启Nginx 4. 访问视频流 &#xff08;二&#xff09;方法2&#xff1a;使用反向代理 1. 安装反向代理服务…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

东北虎豹国家公园shp格式范围

东北虎豹国家公园地处中国吉林、黑龙江两省交界的老爷岭南部&#xff08;珲春—汪清—东宁—绥阳&#xff09;区域&#xff0c;东起吉林省珲春林业局青龙台林场&#xff0c;与俄罗斯滨海边疆区接壤&#xff0c;西至吉林省大兴沟林业局岭东林场&#xff0c;南自吉林省珲春林业局…

练习LabVIEW第三十七题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十七题&#xff1a; 利用XY GRAPH 构成李萨如图形 开始编写&#xff1a; 前面板放一个XY图控件&#xff0c;程序框图…