了解RabbitMQ的工作原理

        RabbitMQ是一个开源的消息代理系统,实现了高级消息队列协议(AMQP)。在现代分布式系统中,特别是在微服务架构中,RabbitMQ有广泛的应用。本文将详细介绍RabbitMQ的工作原理,并通过实践案例帮助读者理解和应用。

一、RabbitMQ简介

        RabbitMQ是用Erlang语言编写的,集群和故障转移是构建在开放电信平台框架上的。它支持多种消息传递协议,主要用于解耦和异步处理。RabbitMQ的消息模型基于交换机(Exchange)、队列(Queue)和路由键(Routing Key)的组合,通过不同的交换机类型实现灵活的消息投递。

二、RabbitMQ的组件及工作原理

 

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

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

三、RabbitMQ的工作流程 
  1. 生产者连接到RabbitMQ服务器,并创建一个通道(Channel)
  2. 生产者在通道中声明一个队列,并将该队列的名称发送给RabbitMQ服务器
  3. RabbitMQ服务器在收到队列名称后,会在内存中为该队列分配空间,并返回一个唯一的队列名称给生产者
  4. 生产者通过通道将消息发送到交换机
  5. 交换机根据路由规则将消息转发到匹配的队列
  6. 消费者连接到RabbitMQ服务器,并创建一个通道(Channel)
  7. 消费者在通道中声明要监听的队列,并告诉RabbitMQ服务器要订阅该队列
  8. RabbitMQ服务器将队列中的消息发送给监听的消费者
  9. 消费者从通道中接收消息,并进行处理
  10. 处理完成后,消费者可以向RabbitMQ服务器发送确认消息(ACK),告诉RabbitMQ服务器该消息已经被成功处理
  11. RabbitMQ服务器会根据消费者的确认消息来决定是否从队列中删除该消息
四、RabbitMQ的消息持久化、确认机制和重试机制
  1. 消息持久化:消息可以持久化存储在磁盘中,即使服务器重启,消息也不会丢失。
  2. 消息确认机制(ACK):消费者确认收到消息后,RabbitMQ才会将其删除;若消息处理失败,可进行重发。
  3. 消息重试与死信队列:消息处理失败后,RabbitMQ可以重试发送,超过重试次数的消息进入死信队列(Dead Letter Queue)。
五、RabbitMQ的工作模式

RabbitMQ有五种工作模式,包括简单队列模式、工作队列模式、发布订阅模式(Fanout)、路由模式(Direct)和主题模式(Topic)。

  1. 简单队列模式(Basic Queue):一个生产者对应一个消费者,消息直接发送到队列,适合简单的消息传递场景。
  2. 工作队列模式(Work Queue):一个生产者对应多个消费者,消费者按轮询方式消费队列中的消息,实现负载均衡。
  3. 发布订阅模式(Publish/Subscribe):每个消费者监听自己的队列;生产者将消息发给Broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。这种模式包括Fanout、Direct和Topic三种类型。
    • Fanout:广播消息,多个消费者接收同一条消息,适合发布订阅模式。
    • Direct:通过路由键将消息路由到指定队列,实现特定的消息投递。
    • Topic:使用通配符路由键,实现模糊匹配的消息投递,适合复杂的多级分类场景。
  4. 路由模式(Routing):消息生产者将消息发送给交换机,按照路由判断,交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息。
  5. 主题模式(Topic):使用通配符路由键,消息产生者产生消息,把消息交给交换机,交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费。
六、RabbitMQ在Spring Boot中的集成与实践

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

引入依赖:在pom.xml中添加RabbitMQ依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

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

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest


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

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.#");}
}

生产者(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);}
}

消费者(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 + ">");}
}

        通过上述配置和代码,我们实现了一个简单的RabbitMQ消息发送和接收的示例。

总结

RabbitMQ作为一个功能强大的消息代理系统,在现代分布式系统中具有广泛的应用。通过了解RabbitMQ的工作原理和组件,以及如何在Spring Boot中集成RabbitMQ,我们可以更好地利用它进行消息的异步处理和解耦。通过实践,我们不仅能深入理解RabbitMQ的工作流程,还能掌握如何在实际项目中应用RabbitMQ,提高系统的可扩展性和可靠性。

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

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

相关文章

Excel中公式和函数的区别

Excel中公式和函数的区别 概念讲解例子公式函数 详细介绍函数面板最后再次进行演示操作文档 概念讲解 公式是用户自己编写的表达式&#xff0c;而函数是由Excel预定义的操作。公式可以包含各种数学运算符和逻辑表达式&#xff0c;函数则是执行特定任务的工具。公式可以引用其他…

分布式搜索引擎之elasticsearch基本使用3

分布式搜索引擎之elasticsearch基本使用3 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&…

【FlutterDart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)

上效果 预期的是通过拖动一条边界线改变窗口大小&#xff0c;类似vscode里拖动效果。这个是简单的拖动实现 上代码&#xff1a; import package:flutter/material.dart;class MyDraggableViewDemo extends StatelessWidget {const MyDraggableViewDemo({super.key});override…

使用Dinky快速提交Flink operator任务

官网地址&#xff1a;K8s集成 | Dinky 1.目前使用版本 Dinky1.2.0、Flink1.18.1、Flink operator0.10.0 2.制作镜像 2.1创建DockerFile ARG FLINK_VERSION1.18.1 FROM flink:${FLINK_VERSION}-scala_2.12 RUN mkdir -p /opt/flink/usrlib COPY commons-cli-1.3.1.jar …

查找路由器的管理后台ip【通用找IP】

需求&#xff1a; 刚刚搞了个【小米】路由器&#xff0c;我想进路由的管理后台&#xff0c;提示&#xff1a;安装xx的路由管家&#xff0c;我不想安装 但是无法找到这个管理后台。 而且我是用这个路由作为中继&#xff0c;那么这个路由的ip就会经常更换 尝试通过网上搜索引擎来…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面

前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…

vue3-watchEffect异步依赖收集

当 b 更新时 a 并不会更新&#xff0c;因为watchEffect的依赖收集在该案例中停止于await asyncFn()&#xff0c;也就是只会收集同步代码的依赖&#xff0c;await 之后的异步代码的依赖并不会收集到 <template> <div>a: {{ a }} <br>b: {{ b }} <br>&l…

【通识安全】煤气中毒急救的处置

1.煤气中毒的主要症状与体征一氧化碳中毒&#xff0c;其中毒症状一般分为轻、中、重三种。 (1)轻度&#xff1a;仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗&#xff0c;或将病人移出中毒环境&#xff0c;使之吸入新鲜空气和休息&#xff0c;给些热饮料&am…

【UI自动化测试】selenium八种定位方式

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac;&am…

redis各种数据类型介绍

Redis 是一种高性能的键值存储数据库&#xff0c;它支持多种数据类型&#xff0c;使得开发者可以灵活地存储和操作数据。以下是 Redis 支持的主要数据类型及其介绍&#xff1a; 1. 字符串&#xff08;String&#xff09; 字符串是 Redis 中最基本的数据类型&#xff0c;它可以存…

【Linux】Linux命令

目录 ​编辑 系统维护命令 man man&#xff1a;查看 man 手册 sudo passwd 用户名&#xff1a;修改用户密码 su&#xff1a;切换用户 echo ”输出内容“&#xff1a;向终端输出内容&#xff0c;默认换行 date查看当前系统的日期 clear&#xff1a;清屏 df -Th /df -h&…

关机重启后,GitLab服务异常

整理机房,关闭了所有主机重新上架。 上架后开机,所有主机硬件启动正常。 其中一台GitLab服务器启动正常,使用gitlab-ctl status查看服务业正常。 但使用web登陆却失败,如下图: 反复测试,发现无论使用正确密码还是错误密码都是同样的提示。很大可能是数据库的问题。 使…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

Python编程实例-特征向量与特征值编程实现

特征向量与特征值编程实现 文章目录 特征向量与特征值编程实现1、什么是特征向量2、特征向量背后的直觉3、为什么特征向量很重要?4、如何计算特征向量?4、特征向量Python实现5、可视化特征向量6、总结线性代数是许多高级数学概念的基石,广泛应用于数据科学、机器学习、计算机…

OpenCV在现代社会中的应用

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;广泛应用于图像处理、计算机视觉以及机器学习领域。随着科技的发展&#xff0c;OpenCV在现代社会中扮演着越来越重要的角色&#xff0c;尤其在以下五个方向中取得了显著的…

开源模型应用落地-qwen2-7b-instruct-LoRA微调合并-ms-swift-单机单卡-V100(十三)

一、前言 本篇文章将使用ms-swift去合并微调后的模型权重,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…

云架构:考量与框架

云架构&#xff1a;考量与框架 引言 在当今的数字化环境中&#xff0c;云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素&#xff0c;讨论重要的考量因素、设计指南&#xff0c;以及最佳实践…

MyBatis 配置文件全解析

一、MyBatis 配置文件为何至关重要&#xff1f; 在 Java 后端开发领域&#xff0c;MyBatis 作为一款广受欢迎的持久层框架&#xff0c;极大地简化了数据库操作。而 MyBatis 配置文件&#xff0c;恰似整个框架的 “神经中枢”&#xff0c;掌控着其运行的方方面面&#xff0c;对…

基于Java的免税商品优选购物商城设计与实现源码(springboot+mybatis+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于Java的免税商品优选购物商城设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于Java的免税…