首页 > 其他分享 >RabbitMQ的原理和集成使用

RabbitMQ的原理和集成使用

时间:2024-10-29 13:49:19浏览次数:6  
标签:集成 队列 springframework RabbitMQ 消息 org 原理 路由

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: localhost
    port: 5672
    username: guest
    password: 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";

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_NAME, true);
    }

    @Bean
    public TopicExchange exchange() {
        return new TopicExchange(EXCHANGE_NAME);
    }

    @Bean
    public 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 {

    @Autowired
    private 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 的基本功能和高级特性,适用于消息通知、任务调度等场景。

标签:集成,队列,springframework,RabbitMQ,消息,org,原理,路由
From: https://blog.csdn.net/qq_35861084/article/details/143327567

相关文章

  • 1 Java 跨平台原理
    JVMJava的特性就是程序员一次编写,到处运行,意思是我们只需要写一份代码,就可以在不同的操作系统(windows、Linux、MacOS等)中运行。但是不同的操作系统能看懂的指令是不同的,所以实现方式就是给每个操作系统开发一个Java虚拟机(JVM)。JVM运行的过程是把我们代码编译后的字节码翻译成系......
  • 深度解读RDS for MySQL 审计日志功能和原理
    本文分享自华为云社区《【华为云MySQL技术专栏】RDSforMySQL审计日志功能介绍》,作者:GaussDB数据库。1.背景在生产环境中,当数据库出现故障或问题时,运维人员需要快速定位出异常或者高危的SQL语句。这时,审计日志能够提供详细的记录,帮助追踪每个数据库操作的执行者、执行时间以......
  • 全面解释人工智能LLM模型的真实工作原理(完结)
    前一篇:《全面解释人工智能LLM模型的真实工作原理(三)》序言:本节作为整篇的收官之作,自然少不了与当今最先进的AI模型相呼应。这里我们将简单介绍全球首家推动人工智能生成人类语言的公司——OpenAI的GPT模型的基本原理。如果你也希望为人类的发展做出贡献,并投身于AI行业,这无疑是一......
  • IP地址查询之数据清洗基本原理
    概:数据清洗的原理是在分析数据源特点的基础上,找出数据质量问题原因,确定清洗要求,然后建立起清洗模型,应用清洗算法、清洗策略和清洗方案对应到数据识别与处理中,最终清洗出满足质量要求的数据。对于数据源分析主要有两块,一个是了解数据源,数据清洗的第一步是深入了解数据源,包括数......
  • 强化学习的数学原理-05蒙特卡洛方法
    目录MCBasicMCExploringStartsMCEpsilon-GreedyMCBasic从\(model\:base\:\)的\(Reinforcement\:learning\:\)过渡到\(model\:free\:\)的\(\:Reinforcement\:learning\:\)最难以理解的是怎么在没有模型的情况下去估计一些量。这里面就有一个重要的\(\:idea......
  • RabbitMQ如果有100万消息堆积在MQ,如何解决(消息堆积怎么解决)
    当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。解决消息堆积有三种思路:增加更多消费者,提高消费速度在消费者内开启线程池加快消息处理速度扩大队列容积,......
  • 深入理解ThreadLocal底层原理
    ThreadLocal是线程私有的,各个线程之间是隔离的。可以想象一下每次线程创建的时候在堆上预先分配一个内存空间用于存储ThreadLocal的数据。(1)当线程被创建时,线程都会有一个成员变量ThreadLocalMap。//每个线程定义一个成员变量ThreadLocalMap。publicclassThreadimplemen......
  • 【MySql进阶及常见方案】mysql索引底层原理和优化手段
    mysql索引底层原理和优化手段不管业务怎么发展,数据最终都要存储到数据库中,所以数据库是必不可少的一个环节。而随着业务逐渐壮大,并发越来越高,数据库很容易成为整个链路的短板。而调优的第一步,都是从sql语句、索引入手。先得保证单个数据库执行没问题,才会有更高层次的分库......
  • 【读书笔记·VLSI电路设计方法解密】问题30:EDA工具在集成电路设计中的作用是什么
    在集成电路设计的最初几年,芯片是通过在绘图板上手动布局电路中的每个晶体管来构建的。难以想象用这种过时的方式设计现代系统级芯片(SoC)需要多少人工年。正是电子设计自动化(EDA)工具从根本上改变了集成电路设计,并使得今天的数百万门设计成为可能。在当今的芯片设计环境中,有......
  • vue集成svg大图拖拽无限放大缩小
    介绍vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singalR接收实时......