# RabbitMQ学习

RabbitMQ

1、RabbitMQ是什么?

RabbitMQ 是一个开源的消息中间件系统,主要用于在分布式系统中存储、转发和接收消息。它实现了 AMQP(高级消息队列协议)标准,能够帮助构建可靠且高效的分布式应用程序

2、RabbitMQ能做什么?

  • 系统解耦:通过消息队列将系统的各个部分解耦,使各个组件可以独立开发、部署和扩展。
  • 异步处理:允许应用程序将某些耗时的操作异步执行,提高系统的响应速度和吞吐量。
  • 流量削峰:在高并发场景下,通过消息队列平滑处理突发的请求流量,避免后端服务过载。
  • 日志处理:收集和处理分布式系统的日志信息,便于集中管理和分析。
  • 任务分发:将任务分发给多个工作节点,实现负载均衡和并行处理。
  • 事件通知:在系统中发生特定事件时,通过消息队列通知其他系统或组件。
  • 数据同步:在多个系统或数据库之间同步数据,确保数据的一致性。
  • 远程过程调用(RPC):通过消息队列实现跨服务的远程调用,简化服务间的交互。
  • 事务管理:支持事务性消息,确保消息的可靠传递。
  • 多语言支持:支持多种编程语言的客户端库,便于不同语言的应用程序进行消息通信。

3、RabbitMQ能给我带来什么好处?

  • 提高系统稳定性:通过消息队列解耦系统组件,减少单点故障,提高系统的整体稳定性和可用性。
  • 增强系统可扩展性:支持水平扩展,可以通过增加更多的消费者来处理更多的消息,轻松应对业务增长。
  • 提升性能:通过异步处理和流量削峰,提高系统的响应速度和吞吐量,优化用户体验。
  • 简化开发:提供丰富的客户端库和管理工具,简化消息处理逻辑的开发和维护工作。
  • 灵活的消息路由:支持多种消息模式和路由策略,满足不同业务场景的需求。
  • 可靠的事务支持:确保消息的可靠传递,支持事务性消息,防止数据丢失。
  • 集中管理:提供管理界面和API,方便监控和管理消息队列的状态和性能。
  • 多语言支持:支持多种编程语言的客户端库,便于不同语言的应用程序进行消息通信。
  • 社区支持:拥有活跃的社区和丰富的文档资源,遇到问题时可以快速获得帮助和支持。
  • 成本效益:开源免费,可以根据业务需求自由定制和扩展,降低开发和运维成本。

4、RabbitMQ如何使用?

安装和配置

  1. 安装RabbitMQ

    • 在Linux上

      sudo apt-get update
      sudo apt-get install rabbitmq-server
      
    • 在Windows上
      下载并安装Erlang和RabbitMQ的安装包,然后启动RabbitMQ服务。

  2. 启动RabbitMQ服务

    sudo systemctl start rabbitmq-server
    
  3. 启用管理插件(可选但推荐)

    sudo rabbitmq-plugins enable rabbitmq_management
    
  4. 访问管理界面

  • 打开浏览器,访问 http://localhost:15672,默认用户名和密码为 guest/guest。

基本概念

  • Exchange:接收生产者发送的消息,并根据绑定规则将消息路由到一个或多个队列。
  • Queue:存储消息,直到它们被消费者消费。
  • Binding:定义了Exchange和Queue之间的关系,决定了消息如何从Exchange路由到Queue。
  • Message:在生产者和消费者之间传递的数据

示例代码(Spring Boot)

  1. 创建Spring Boot项目:
    使用Spring Initializr创建一个新的Spring Boot项目,选择以下依赖:
  • Spring Web
  • Spring AMQP
  1. 配置RabbitMQ:\
在 application.properties 文件中配置RabbitMQ连接信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
  1. 创建生产者
    创建一个生产者类 RabbitMQProducer:
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class RabbitMQProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;@Beanpublic Queue helloQueue() {return new Queue("hello");}public void sendMessage(String message) {rabbitTemplate.convertAndSend("hello", message);System.out.println(" [x] Sent '" + message + "'");}
}
  1. 创建消费者
    创建一个消费者类 RabbitMQConsumer:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class RabbitMQConsumer {@RabbitListener(queues = "hello")public void receiveMessage(String message) {System.out.println(" [x] Received '" + message + "'");}
}
  1. 创建控制器
    创建一个控制器 RabbitMQController 来触发消息发送:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RabbitMQController {@Autowiredprivate RabbitMQProducer producer;@GetMapping("/send")public String sendMessage(@RequestParam String message) {producer.sendMessage(message);return "Message sent: " + message;}
}
  1. 启动类
    创建一个启动类 RabbitMQApplication:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RabbitMQApplication {public static void main(String[] args) {SpringApplication.run(RabbitMQApplication.class, args);}
}

运行项目

  1. 启动RabbitMQ服务:
sh
sudo systemctl start rabbitmq-server
  1. 运行Spring Boot应用: 使用IDE或命令行启动Spring Boot应用:
mvn spring-boot:run
  1. 发送消息:
    打开浏览器,访问 <http://localhost:8080/send?message=Hello World>
    你应该会在控制台看到消息被发送和接收的输出。

5、RabbitMQ的原理是什么?

基本架构

RabbitMQ 是一个基于 AMQP(Advanced Message Queuing Protocol)的消息中间件,其核心组件包括:

  • 生产者(Producer):发送消息到交换机(Exchange)。
  • 交换机(Exchange):接收生产者发送的消息,并根据绑定规则将消息路由到一个或多个队列。
  • 队列(Queue):存储消息,直到它们被消费者消费。
  • 消费者(Consumer):从队列中接收消息并处理。
  • 绑定(Binding):定义了交换机和队列之间的关系,决定了消息如何从交换机路由到队列。

工作流程

  1. 生产者发送消息

    • 生产者将消息发送到指定的交换机。
    • 消息包含一个路由键(Routing Key),用于交换机确定消息的去向。
  2. 交换机路由消息

    • 交换机根据绑定规则和路由键将消息路由到一个或多个队列。
    • 不同类型的交换机有不同的路由规则,常见的交换机类型有:
      • Direct Exchange:精确匹配路由键。
      • Fanout Exchange:广播消息到所有绑定的队列,忽略路由键。
      • Topic Exchange:基于模式匹配路由键。
      • Headers Exchange:基于消息头属性进行路由。
  3. 队列存储消息

    • 队列接收到消息后将其存储起来,直到被消费者消费。
    • 队列可以设置为持久化或非持久化,以确保消息在服务器重启后仍然存在。
  4. 消费者接收消息

    • 消费者从队列中拉取或订阅消息。
    • 消费者处理完消息后,向RabbitMQ发送确认(ACK),表示消息已被成功处理。
    • 如果消费者在处理消息过程中失败或崩溃,RabbitMQ会将消息重新放入队列,等待其他消费者处理。

消息传递模式

RabbitMQ 支持多种消息传递模式,包括但不限于:

  • 简单模式(Simple)

    • 生产者直接将消息发送到队列,消费者从队列中接收消息。
    • 适用于简单的点对点通信。
  • 发布/订阅模式(Publish/Subscribe)

    • 生产者将消息发送到扇形交换机(Fanout Exchange),交换机将消息广播到所有绑定的队列。
    • 适用于一对多的广播场景。
  • 路由模式(Routing)

    • 生产者将消息发送到直连交换机(Direct Exchange),交换机根据路由键将消息路由到指定的队列。
    • 适用于多条件路由的场景。
  • 主题模式(Topic)

    • 生产者将消息发送到主题交换机(Topic Exchange),交换机根据路由键的模式匹配将消息路由到多个队列。
    • 适用于复杂的多条件路由场景。

可靠性保证

  • 消息确认(Acknowledgment)

    • 消费者处理完消息后,向RabbitMQ发送确认(ACK),表示消息已被成功处理。
    • 如果消费者在处理消息过程中失败或崩溃,RabbitMQ会将消息重新放入队列,等待其他消费者处理。
  • 消息持久化

    • 将消息和队列设置为持久化,确保消息在RabbitMQ服务器重启后仍然存在。
    • 持久化消息会写入磁盘,但会影响性能。
  • 事务支持

    • 支持事务性消息,确保消息的可靠传递。
    • 事务模式下,生产者发送消息后,RabbitMQ会等待事务提交或回滚。

性能优化

  • 消息批处理
    • 生产者可以批量发送消息,减少网络开销。
  • 预取计数(Prefetch Count)
    • 限制每个消费者在同一时间处理的消息数量,避免某个消费者积压过多消息。
  • 集群和镜像队列
    • 通过集群和镜像队列提高系统的可用性和性能。
    • 集群可以实现负载均衡,镜像队列可以实现高可用性。

6、RabbitMQ总结

简介

RabbitMQ 是一个开源的消息代理和队列服务器,基于 AMQP(Advanced Message Queuing Protocol)协议。它提供了灵活的消息传递机制,支持多种消息传递模式,广泛应用于分布式系统中,用于解耦系统组件、实现异步处理和流量削峰等场景。

核心组件

  • 生产者(Producer):发送消息到交换机。
  • 交换机(Exchange):根据绑定规则将消息路由到队列。
  • 队列(Queue):存储消息,直到被消费者消费。
  • 消费者(Consumer):从队列中接收并处理消息。
  • 绑定(Binding):定义交换机和队列之间的关系。

主要功能

  • 系统解耦:将系统组件解耦,提高模块独立性。
  • 异步处理:支持异步任务处理,提高系统响应速度。
  • 流量削峰:平滑处理突发流量,避免后端服务过载。
  • 日志处理:集中管理和分析分布式系统的日志。
  • 任务分发:实现任务的负载均衡和并行处理。
  • 事件通知:在系统中发生特定事件时通知其他组件。
  • 数据同步:确保多个系统或数据库之间的数据一致性。

优势

  • 可靠性:通过消息确认、持久化和事务支持确保消息可靠传递。
  • 灵活性:支持多种消息传递模式,适应不同业务需求。
  • 高性能:通过批处理、预取计数和集群技术提高性能。
  • 易用性:提供丰富的客户端库和管理工具,简化开发和维护。
  • 社区支持:拥有活跃的社区和丰富的文档资源。

应用场景

  • 微服务架构:实现服务间通信和解耦。
  • 日志处理:集中管理和分析日志信息。
  • 任务调度:实现任务的负载均衡和并行处理。
  • 实时通知:在系统中发生特定事件时通知其他组件。
  • 数据同步:确保多个系统或数据库之间的数据一致性。

结论

RabbitMQ 是一个强大而灵活的消息中间件,适用于各种分布式系统和应用场景。通过合理使用RabbitMQ,可以显著提高系统的稳定性和性能,简化系统的开发和维护工作。

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

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

相关文章

Docker Compose V2 安装

要安装 docker-compose-plugin&#xff0c;需要确保系统已安装 Docker 引擎&#xff0c;因为 docker-compose-plugin 是 Docker CLI 的插件&#xff08;Docker Compose V2&#xff09;。以下是详细指南&#xff1a; 1. 安装 Docker 引擎&#xff1a; 确保系统上安装了 Docker…

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

Git 的分支管理

一、分支介绍 1、分支是什么 Git作为一个分布式版本控制系统&#xff0c;提供了强大而灵活的分支管理功能&#xff0c;使得开发团队能够高效地协作开发、管理不同的功能和版本。 2、为什么有分支 一般情况下主分支&#xff08;master/main&#xff09;应始终保持可部署的状…

Linux环境基础和基础开发工具使用

文章目录 一、yum软件管理器1、包管理器2、yum3、apt4、安装源 二、编辑器vim1、各种模式2、打开时直接让光标定位到指定号3、&#xff01;加命令字符 三、命令模式1、i 进入插入模式2、**Shift :** 进入底行模式3、光标定位4、ZZ&#xff08;大写&#xff09;保存并退出vim5、…

2024 信友队 noip 冲刺 10.10

T1 前缀和 二分即可&#xff0c;再考虑一下左右端点还在睡觉的情况。 // Problem: D - Sleep Log // Contest: AtCoder - KYOCERA Programming Contest 2023&#xff08;AtCoder Beginner Contest 305&#xff09; // URL: https://atcoder.jp/contests/abc305/tasks/abc305…

【java】哈希<两数之和> 理解哈希

两数之和 题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你…

【Linux】信号三部曲——产生、保存、处理

信号 1. 信号的概念2. 进程如何看待信号3. 信号的产生3.1. kill命令3.2. 终端按键3.2.1. 核心转储core dump3.2.2. OS如何知道键盘在输入数据 3.3. 系统调用3.3.1. kill3.3.2. raise3.3.3. abort 3.4. 软件条件3.4.1. SIGPIPE信号3.4.2. SIGALRM信号 3.5. 硬件异常3.5.1. 除零异…

Vue 计算属性和监听器

文章目录 一、计算属性1. 计算属性定义2. computed 比较 methods3. 计算属性完整写法 二、监听器1. 普通监听2. 添加额外配置项 一、计算属性 1. 计算属性定义 概念&#xff1a;基于现有的数据&#xff0c;计算出来的新属性&#xff0c;依赖的数据变化&#xff0c;自动重新计…

【计网】实现reactor反应堆模型 --- 框架搭建

没有一颗星&#xff0c; 会因为追求梦想而受伤&#xff0c; 当你真心渴望某样东西时&#xff0c; 整个宇宙都会来帮忙。 --- 保罗・戈埃罗 《牧羊少年奇幻之旅》--- 实现Reactor反应堆模型 1 前言2 框架搭建3 准备工作4 Reactor类的设计5 Connection连接接口6 回调方法 1 …

【ARM Linux 系统稳定性分析入门及渐进 1.4 -- Crash 工具调用】

文章目录 Crash 工具的调用在实时系统上运行 crash自动查找内核对象文件内核构建要求Crash 工具的调用输出成功调用示例Crash 工具的调用 在使用 crash 工具分析转储文件时,至少需要两个参数: 内核对象文件名:通常称为内核 namelist。在最初从内核源代码构建时,其名称是 v…

外包干了2年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科毕业&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会…

linux驱动-i2c子系统框架学习(2)

linux驱动-i2c子系统框架学习(1) 在这篇博客里面已经交代了i2c设备驱动层&#xff0c;主要的功能就是编写具体i2c的外设驱动&#xff0c;和创建设备接点给上层使用 &#xff0c;按之前学习的字符设备&#xff0c;有了设备节点&#xff0c;就可以对硬件操作了&#xff0c;在i2c…

Webserver(4.6)poll和epoll

目录 pollclient.cpoll.c epollepoll.cclient.c epoll的两种工作模式水平触发边沿触发 poll poll是对select的一个改进 select的缺点在于每次都需要将fd集合从用户态拷贝到内核态&#xff0c;开销很大。每次调用select都需要在内核遍历传递进来的所有fd&#xff0c;这个开销也…

Stable Diffusion的解读(一)

Stable Diffusion的解读&#xff08;一&#xff09; 文章目录 Stable Diffusion的解读&#xff08;一&#xff09;摘要Abstract一、机器学习部分1. Stable Diffusion的早期工作1.1 从编码器谈起1.2 第一条路线&#xff1a;VAE和DDPM1.3 第二条路线&#xff1a;VQVAE1.4 路线的交…

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗&#xff1f; 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的&#xff1f; 一次握手:客户端发送带有 …

ROS话题通信机制理论模型的学习

话题通信是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;中使用频率最高的一种通信模式&#xff0c;其实现模型主要基于发布/订阅模式。 一、基本概念 话题通信模型中涉及三个主要角色&#xff1a; ROS Master&#xff08;管理者&#xff0…

【Android】名不符实的Window类

1.“名不符实”的Window类 Window 是一个窗口的概念&#xff0c;是所有视图的载体&#xff0c;不管是 Activity&#xff0c;Dialog&#xff0c;还是 Toast&#xff0c;他们的视图都是附加在 Window 上面的。例如在桌面显示一个悬浮窗&#xff0c;就需要用到 Window 来实现。Wi…

后端java——如何为你的网页设置一个验证码

目录 1、工具的准备 2.基本方法 3.实现类 4.实践 HTML文件&#xff1a; Java文件1:创建验证码 Java文件2:验证验证码 本文通过HUTOOL实现&#xff1a;Hutool参考文档Hutool&#xff0c;Java工具集https://hutool.cn/docs/#/ 1、工具的准备 如果我们通过hutool来实现这个…

MySQL如何实现PHP输入安全

在PHP中使用MySQL时&#xff0c;实现输入安全至关重要&#xff0c;以防止SQL注入攻击。以下是一些实现输入安全的方法和最佳实践&#xff1a; 1. 使用预处理语句&#xff08;Prepared Statements&#xff09; 预处理语句是防止SQL注入的最佳方法。通过预处理语句&#xff0c;…

【go从零单排】Strings and Runes 字符串和字符

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 概念 在Go语言中&#xff0c;rune 是一个内置的数据类型&#xff0c;用于表示一个Unicode字符。它实际上是一个别名…