一文读懂RabbitMQ核心概念及架构

news2024/12/25 22:38:48

1. RabbitMQ简介

RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP)。它是一个应用程序对应用程序的通信方法,基于消费-生产者模型。在RabbitMQ中,消息的生产者将消息发布到队列中,而消息的消费者则从队列中获取并处理这些消息。它支持多种编程语言,包括Java、Python、Ruby等。

2.RabbitMQ的优缺点

RabbitMQ的优点:

  1. 可靠性:RabbitMQ使用消息确认机制,确保消息的可靠传递。生产者在发送消息后会收到一个确认,消费者在处理完消息后会发送一个确认。如果消息发送或处理失败,RabbitMQ会重新发送消息,直到确认为止。
  2. 灵活性:RabbitMQ支持多种消息传递模式,包括点对点、发布/订阅和消息路由等。这使得开发人员可以根据具体需求选择最适合的模式。
  3. 可扩展性:RabbitMQ可以通过添加更多的节点来实现水平扩展,以处理更大的消息负载。它还支持集群和镜像队列,提供高可用性和负载均衡。
  4. 多语言支持:RabbitMQ提供了多种编程语言的客户端库,包括Java、Python、Ruby、C#等。这使得开发人员可以使用自己熟悉的语言来与RabbitMQ进行交互。
  5. 异步通信:RabbitMQ通过异步通信机制可以显著提高系统的响应速度和吞吐量。
  6. 解耦服务:RabbitMQ通过解耦服务之间的依赖关系,减少了服务之间的相互影响,提高了系统整体的稳定性和可扩展性。
  7. 削峰:RabbitMQ可以以稳定的系统资源应对突发的流量冲击,有效地进行流量削峰。

RabbitMQ的缺点:

  1. 系统可用性降低:由于引入了外部依赖,系统的稳定性会变差。一旦RabbitMQ宕机,可能会对业务产生影响。
  2. 系统复杂度提高:引入RabbitMQ后,系统的复杂度会大大提高。原本的服务之间同步的服务调用会变成异步调用,数据链路会变得更复杂,并且还会带来一系列问题。
  3. 消息一致性问题:在多系统之间进行消息传递时,需要考虑消息的一致性问题。例如,如果B系统成功处理了消息而C系统失败,需要有一种机制来处理这种情况以保持消息的一致性。
  4. 数据丢失风险:如果使用不可靠的网络或者不恰当的配置,可能会导致消息在传输过程中丢失。
  5. 性能瓶颈:虽然RabbitMQ支持水平扩展,但如果生产者和消费者的处理能力不匹配,可能会导致消息积压和性能问题。
  6. 学习曲线陡峭:对于初学者来说,RabbitMQ的概念和用法可能比较复杂,需要花费一定的时间和精力来学习和掌握。
  7. 安全性问题:虽然RabbitMQ提供了一些安全特性,如用户认证和访问控制,但如果没有正确配置或管理,可能会存在安全风险。

在使用RabbitMQ时,需要综合考虑这些优点和缺点,根据实际需求和场景进行合理的选择和应用。

3.RabbitMQ的实现原理以及工作流程

先给出一个rabbitmq的工作流程图,大家就可以有一个直观的感受

在这里插入图片描述

RabbitMQ的实现原理和工作流程主要基于AMQP(高级消息队列协议)和一些核心概念,如生产者、消费者、队列、交换机等。以下是详细的实现原理和工作流程:

实现原理:

  1. 队列(Queue):RabbitMQ使用队列来存储和转发消息。每个队列都是一个消息缓冲区,用于在消息生产者和消费者之间进行异步通信。
  2. 生产者(Producer):生产者是消息的发送方,它将消息发送到RabbitMQ的交换机(Exchange)中。
  3. 消费者(Consumer):消费者是消息的接收方,它从RabbitMQ的队列中获取并处理消息。
  4. 交换机(Exchange):交换机负责接收生产者的消息,并根据一定的路由规则将这些消息分发到不同的队列中。RabbitMQ提供了四种类型的交换机:直接交换机(Direct)、扇出交换机(Fanout)、主题交换机(Topic)和消息头交换机(Headers)。
  5. 路由键(Routing Key):路由键是交换机在路由消息时使用的关键字。生产者发送消息时可以指定路由键,交换机根据路由键将消息分发到相应的队列。
  6. 绑定(Binding):绑定是将交换机和队列按照路由规则进行关联的过程。通过绑定,交换机可以将消息路由到指定的队列。

工作流程:

  1. 生产者发送消息:生产者通过RabbitMQ的客户端库创建消息,并使用指定的交换机和路由键将消息发送到RabbitMQ服务器。
  2. 交换机接收并路由消息:交换机接收到生产者的消息后,根据配置的路由规则和路由键将消息分发到相应的队列中。
  3. 消费者消费消息:消费者连接到RabbitMQ服务器,并监听指定的队列。当队列中有新消息时,消费者从队列中获取并处理消息。处理完成后,消费者可以选择发送确认消息给RabbitMQ服务器,以表示消息已被成功处理。

在整个工作流程中,RabbitMQ服务器充当了消息代理的角色,负责在生产者和消费者之间进行消息的传递和路由。通过使用队列、交换机和路由键等核心概念,RabbitMQ实现了高效、可靠和灵活的消息传递机制。

需要注意的是,RabbitMQ还支持一些高级特性和扩展,如消息持久化、事务、集群和镜像队列等。这些特性和扩展可以进一步提高RabbitMQ的可用性、可靠性和扩展性。

4. Linux下安装RabbitMQ

4.1 下载RabbitMQ

访问RabbitMQ官方网站(https://www.rabbitmq.com/download.html),选择适合您操作系统的版本进行下载。

4.2 解压并安装

将下载的RabbitMQ压缩包解压到合适的目录,例如/opt。然后进入解压后的目录,执行以下命令进行安装:

sudo apt-get update
sudo apt-get install -y rabbitmq-server
4.3 启动RabbitMQ服务

安装完成后,启动RabbitMQ服务:

sudo systemctl start rabbitmq-server
4.4 设置开机自启

为了让RabbitMQ服务在系统启动时自动运行,可以执行以下命令:

sudo systemctl enable rabbitmq-server

5. RabbitMQ基本命令

RabbitMQ提供了一些基本的命令来管理队列、交换机和绑定关系。以下是一些常用的命令:

5.1 创建队列

使用rabbitmqctl命令创建一个新的队列:

rabbitmqctl create_queue queue_name
5.2 删除队列

使用rabbitmqctl命令删除一个队列:

rabbitmqctl delete_queue queue_name
5.3 列出所有队列

使用rabbitmqctl命令列出所有的队列:

rabbitmqctl list_queues name messages auto_delete
5.4 创建交换机

使用rabbitmqctl命令创建一个新的交换机:

rabbitmqctl add_exchange exchange_name type

其中,exchange_name是交换机的名称,type是交换机的类型,可以是directfanouttopic等。

5.5 删除交换机

使用rabbitmqctl命令删除一个交换机:

rabbitmqctl delete_exchange exchange_name
5.6 列出所有交换机

使用rabbitmqctl命令列出所有的交换机:

rabbitmqctl list_exchanges name type durable auto_delete internal
5.7 创建绑定关系

使用rabbitmqctl命令创建一个新的绑定关系:

rabbitmqctl bind_queue queue_name exchange_name routing_key

其中,queue_name是要绑定的队列名称,exchange_name是交换机名称,routing_key是路由键。

5.8 删除绑定关系

使用rabbitmqctl命令删除一个绑定关系:

rabbitmqctl unbind_queue queue_name exchange_name routing_key
5.9 列出所有绑定关系

使用rabbitmqctl命令列出所有的绑定关系:

rabbitmqctl list_bindings source destination routing_key

6. RabbitMQ与Spring Boot集成

要将RabbitMQ与Spring Boot集成,需要遵循以下步骤:

6.1 添加依赖

在项目的pom.xml文件中添加RabbitMQ Spring Boot Starter依赖:

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

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

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
6.3 创建消息生产者

创建一个消息生产者类,用于发送消息到RabbitMQ队列:

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessageProducer {
    private final AmqpTemplate amqpTemplate;
    private final String exchange = "my_exchange"; // 交换机名称,可自定义
    private final String routingKey = "my_routing_key"; // 路由键,可自定义(可选)

    @Autowired
    public MessageProducer(AmqpTemplate amqpTemplate) {
        this.amqpTemplate = amqpTemplate;
    }

    public void sendMessage(String message) {
        amqpTemplate.convertAndSend(exchange, routingKey, message);
    }
}
6.4 创建消息消费者

创建一个消息消费者类,用于从RabbitMQ队列中接收消息:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class MessageConsumer {
    @RabbitListener(queues = "my_queue") // 队列名称,可自定义(可选)
    public void receiveMessage(String message) {
        System.out.println("Received message: " + message);
    }
}
6.5 测试集成效果

现在可以在项目中使用MessageProducer发送消息,并在MessageConsumer中接收消息。例如,在主类中调用sendMessage方法发送消息:

public static void main(String[] args) {
    MessageProducer messageProducer = new MessageProducer(); // 假设已经注入了AmqpTemplate实例
    messageProducer.sendMessage("Hello, RabbitMQ!");
}

这样,我们就完成了RabbitMQ在Linux下的安装、基本命令以及与Spring Boot的集成。

最后送大家一句话白驹过隙,沧海桑田

文末送福利啦~

1、Java(SE、JVM)、算法数据结构、数据库(Mysql、redis)、Maven、Netty、RocketMq、Zookeeper、多线程、IO、SSM、Git、Linux、Docker、Web前端相关学习笔记
2、2023最新BATJ大厂面试题集
3、项目源码
4、学习小组
领取方式:关注下方公主号,回复:【笔记】、【面试】获取相关福利。

文章持续更新,可以关注下方公众号或者微信搜一搜「 迷迭香编程 」获取项目源码、干货笔记、面试题集,第一时间阅读,获取更完整的链路资料。

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

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

相关文章

AI智能绘图

AI智能绘图是一种创新的图像生成技术&#xff0c;它使用人工智能算法来根据用户输入的文本描述或参考图片自动生成艺术作品。这种技术分为两个方面&#xff1a;文生图和图生图。 首先我们需要浏览器搜索“固乔科技”官网&#xff0c;先下载并安装固乔智创助手软件。完成后&…

vue3源码(二)reactiveeffect

一.reactive与effect功能 reactive方法会将对象变成proxy对象&#xff0c; effect中使用reactive对象时会进行依赖收集&#xff0c;稍后属性变化时会重新执行effect函数。 <div id"app"></div><script type"module">import {reactive,…

HTML标签(二)

目录 表格标签 表格的主要作用 表格的具体用法 表头单元格标签 表格属性 表格结构标签 合并单元格 合并单元格的方式&#xff1a; 跨行合并&#xff1a; 跨列合并&#xff1a; 列表标签 无序列表 有序列表 自定义列表 表单标签 表单域 表单域的常用属性 表单元素…

SpringBoot整合ElasticSearch实现基础的CRUD操作

本文来说下SpringBoot整合ES实现CRUD操作 文章目录 概述spring-boot-starter-data-elasticsearch项目搭建ES简单的crud操作保存数据修改数据查看数据删除数据 本文小结 概述 SpringBoot支持两种技术和es交互。一种的jest&#xff0c;还有一种就是SpringData-ElasticSearch。根据…

ARM安装与项目结构

1. 安装环境 参考E:\peixunQianrushi\arm\ziliao\FS4412新版&#xff08;学生资料&#xff09;\环境相关资料 这边建议全部默认路径 安装注意事项&#xff1a; 1、在接下来的安装过程中&#xff0c;对于使用win10、win8的操作系统的用户&#xff0c;所有的安装请均以管理员身份…

oracle 19c rac集群管理 ------ 日志管理

oracle 19C rac 数据库的目录结构及日志路径 在Oracle 19c RAC&#xff08;Real Application Clusters&#xff09;集群中&#xff0c;有多个组件和层级生成的日志文件&#xff0c;记录着集群的活动、事件和错误信息&#xff0c;用于故障诊断、性能优化和集群管理。以下是常见…

java抽象工厂实战与总结

文章目录 一、工厂模式&#xff08;三种&#xff09;1.简单工厂模式1.1 概念&#xff1a;1.2 使用场景&#xff1a;1.3 模型图解&#xff1a;1.4 伪代码&#xff1a; 2.工厂方法模式2.1 概念&#xff1a;2.2 使用场景&#xff1a;2.3 模型图解&#xff1a;2.4 伪代码 3.抽象工厂…

动态库和静态库的理解 Linux

其实库文件里面的内容就是函数的实现方法&#xff0c;向我们包含的头文件其实就是函数的生命&#xff0c;而我们编译链接程序时会自动加载库文件&#xff0c;最终形成可执行程序。其实我们在编译链接时不仅仅会将文件的库文件加载进来&#xff0c;其实头文件也是需要加载进来的…

工作进入第八年,还在成长的一年

这一年没有写太多的技术博客&#xff0c;是因为工作内容发生了较大的改变&#xff0c;岗位也发生了调整。随着ChatGPT的爆火&#xff0c;无论从公司的领导层&#xff0c;还是从现场的用户&#xff0c;人工智能算是被彻底颠覆了&#xff0c;每个人对生成式人工智能的期待太高&am…

架构篇24:排除架构可用性隐患的利器-FMEA方法

文章目录 FMEA 介绍FMEA 方法FMEA 实战小结 前面的专栏分析高可用复杂度的时候提出了一个问题&#xff1a;高可用和高性能哪个更复杂&#xff0c;根据墨菲定律“可能出错的事情最终都会出错”&#xff0c;架构隐患总有一天会导致系统故障。因此&#xff0c;我们在进行架构设计的…

Intel Atom + Artix-7 100T FPGA,CompactRIO单板控制器

模拟和数字I/O&#xff0c;RMC&#xff0c;DisplayPort&#xff0c;1.33 GHz双核CPU&#xff0c;1 GB DRAM&#xff0c;4 GB存储容量&#xff0c;Artix-7 100T FPGA&#xff0c;CompactRIO单板控制器 CompactRIO控制器是搭载了实时处理器和用户可编程FPGA的嵌入式控制器。其产…

低代码(Low-Code)技术简化开发难度,快速搭建应用

目录 一、低代码技术定义 二、低代码技术优势 1.提高企业的工作效率 2.降低企业的开发成本 3.提高应用程序和业务流程的质量 三、稳定性和生产率的最佳实践 三、最后 随着数字化时代的到来&#xff0c;低代码&#xff08;Low-Code&#xff09;技术已经成为了企业数字化转…

如何使用Docker本地部署Jupyter Notebook并结合内网穿透实现远程访问

&#x1f4d1;前言 本文主要是Linux下通过使用Docker本地部署Jupyter Notebook并结合内网穿透实现远程访问的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;…

别不信❗️你离数据专家只差一个CDMP证书

1⃣️为什么选择CDMP证书&#xff1f; &#x1f31f;&#x1f31f;亲爱的朋友们&#xff0c;如果你在寻找一个能让你在数据管理领域大展拳脚的证书&#xff0c;那么CDMP&#xff08;Certified Data Management Professional&#xff09;证书就是你的不二之选&#xff01;&#…

JavaScript进阶:WebAPIs重点知识整理2

目录 1 对节点的相关操作 1.1 查找节点 1.1.1 查找节点的父节点 1.1.2 查找节点的子节点 1.1.3 查找节点的兄弟节点 1.2 新增节点&#xff08;先创建&#xff0c;后追加&#xff09; 1.3 克隆节点 1.4 删除节点 2 M 端&#xff08;移动端&#xff09;事件 3 JS清空表…

hadoop集群规划部署

一、集群规划 三台硬件资源&#xff0c;部署hadoop版本&#xff0c;hadoop-3.3.5 &#xff0c;部署后配置文件。 Hadoop配置文件分两类&#xff1a;默认配置文件和自定义配置文件。 hadoop102hadoop103hadoop104HDFS NameNode DataNode DataNode SecondaryNameNode DataN…

深度强化学习Task3:A2C、A3C算法

本篇博客是本人参加Datawhale组队学习第三次任务的笔记 【教程地址】 文章目录 Actor-Critic 算法提出的动机Q Actor-Critic 算法A2C 与 A3C 算法广义优势估计A3C实现建立Actor和Critic网络定义智能体定义环境训练利用JoyRL实现多进程 练习总结 Actor-Critic 算法提出的动机 蒙…

Matlab|基于改进遗传算法的储能选址定容(可任意设定储能数量)

目录 主要内容 部分代码 结果一览&#xff08;以3个储能为例&#xff09; 下载链接 主要内容 该模型采用改进遗传算法优化配电网系统中储能选址位置和容量&#xff0c;程序以IEEE33节点系统为分析对象&#xff0c;以网损最小为目标&#xff0c;采用matpower实现系…

谷粒商城-微服务架构图

整体架构 分布式划分图

蓝牙运动耳机什么牌子的好?蓝牙运动耳机品牌排行榜前十名

​运动耳机是耳机中使用场景最广泛的一类&#xff0c;特别适合户外运动、健身和骑行等场景。在众多运动耳机中&#xff0c;哪一款更值得入手呢&#xff1f;今天我将向大家推荐几款相当不错的运动耳机&#xff0c;它们不仅音质上乘&#xff0c;还能满足不同运动场景的需求。 1.…