# 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.xdnf.cn/news/7950.html

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

相关文章

【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动

前言 简单实现一下地图加载、要素绘制、折点编辑和拖拽移动。打算统一都写到一个类里面。 为了快速实现&#xff0c;直接去参考了官方案例。 创建地图 pnpm install ol加载地图 在这里&#xff0c;我们创建一个 mapView.js 的文件专门用来放地图和视图相关的方法&#xff0…

从0开始linux(23)——文件(4)磁盘定址方式

欢迎来到博主的专栏&#xff1a;从0开始Linux 博主ID&#xff1a;代码小豪 文章目录 CHS寻址模式LBA寻址 前面我们介绍了文件管理系统&#xff0c;我们说&#xff0c;当我们使用系统调用open时&#xff0c;操作系统会将磁盘当中的文件加载到内存当中&#xff0c;创建一个struct…

wireshark工具使用

复制数据 1.右键展开整帧数据 2.复制“所有可见项目” mark标记数据 标记&#xff1a; 跳转&#xff1a; 保存成文件&#xff1a; 文件–>导出特定分组—>Marked packets only

固定宽度--文字多少不一样--需要文字充满整个宽度

固定宽度–文字多少不一样–需要文字充满整个宽度 1.场景–登陆页面 这样显示显然不太行 那我们想要是这种情况吗–用户名和密码都充满真个宽度的div 2.代码实现—其中一个重要属性最为关键 text-align-last: justify css <style>.user{width:60px;background-colo…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot&#xff0c;旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能&#xff0c;简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手&#xff0c;助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

4种鼓励创业创新的方法

随着市场趋于饱和&#xff0c;许多企业&#xff0c;尤其是初创企业&#xff0c;很难在竞争中保持领先地位。技术为企业彻底改变其营销和管理策略铺平了道路。另一个经过实践检验的成功渗透特定市场的方法是在办公室内部激发创新&#xff0c;从员工到品牌皆如此。 那么究竟如何…

Spark的yarn集群环境搭建

一.为什么要搭建yarn集群 为什么要将Spark的程序运行在YARN上&#xff0c;不运行在自带的 Standalone集群上&#xff1f; 1、统一化资源管理 Standalone是Spark专用的资源管理集群&#xff0c;只能用于运行 Spark程序 YARN是功能的分布式资源管理平台&#xff0c;可以运行各种分…

【react使用AES对称加密的实现】

react使用AES对称加密的实现 前言使用CryptoJS库密钥存放加密方法解密方法结语 前言 项目中要求敏感信息怕被抓包泄密必须进行加密传输处理&#xff0c;普通的md5加密虽然能解决传输问题&#xff0c;但是项目中有权限的用户是需要查看数据进行查询的&#xff0c;所以就不能直接…

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

ReactPress 是什么?

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是什么&#xff1f; ReactPress 是使用React开发的开源发布平台&#xff0c;用户可以在支持React和MySQL数据库的服务器上架设属于自己的博客、网站。也可以把 ReactP…

ai外呼机器人的作用有哪些?

ai外呼机器人具有极高的工作效率。日拨打成千上万通不是问题&#xff0c;同时&#xff0c;机器人还可以快速筛选潜在客户&#xff0c;将更多精力集中在有价值的客户身上&#xff0c;进一步提升营销效果。183-3601-7550 ai外呼机器人的作用&#xff1a; 1、搭建系统&#xff0c…

福禄克DTX,DSX系列内置标准以及生成的测试报告如何解读?

今日,接到一些朋友的询问?虽然使用了很长一段时间的FLUKE DSX-5000或者DSX-8000,但是对于测试标准和测试生成的报告一知半解,借此咱们一块屡屡清楚。 1,经常有的朋友拿到设备后,第一时间就问,咱们福禄克内置的标准的多少?我线的参数(被测的铜缆)达到多少db,才能算过…

我与Linux的爱恋:磁盘的存储管理

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 磁盘的存储管理 磁盘的存储管理 在我们日常生活中&#xff0c;我们要打开很多文件(要打开这个文件需要先找到这个文件->要在磁盘中先找到->通过文件路径文件…

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…

Python基础学习_01

目录 1、注释 2、数字和数学计算 3、变量 4、字符串 5、打印 6、本节总结 1、注释 • 什么是注释&#xff1f; 1&#xff09;注释就是用自然语言向代码阅读者说明代码的功能和意义 • 注释 1&#xff09;单行注释使用 # 为开头&#xff1b;并且不能换行…

操作系统学习笔记-3.2虚拟内存

文章目录 虚拟内存请求分页管理方式页面置换算法最佳置换算法工作原理OPT 算法的示例最佳置换算法的优点和缺点 先进先出置换算法最近最久未使用时钟置换算法时钟置换算法的工作原理&#xff1a;算法的步骤&#xff1a; 改进型时钟置换算法改进型时钟置换算法的特点&#xff1a…

vue3 封装aixos

1. Vue3 封装 aixos 并且 使用 aixos 请求数据 npm install axios # 或者 yarn add axios 2. Vue3 封装 aixos 并且 使用 aixos 请求数据 封装 axios可以帮助我们更好地管理 HTTP 请求&#xff0c;例如添加统一的基础URL、请求头、拦截器等功能。 下面是封装 axios的一个示…

量子计算机能解决哪些问题?

经典与量子难度对比 在深入示例之前&#xff0c;我们首先讨论一下如何研究和分类各种问题的难度。有些问题可以在经典计算机上轻松解决&#xff0c;我们不需要量子计算机来解决它们。另一方面&#xff0c;有些问题非常困难&#xff0c;需要量子计算机来解决。一个著名的例子是寻…

中电金信:院长寄语|关于源启AI+行动的思考

中国电子首席科学家 中电金信研究院院长 况文川 自2022年8月19日发布以来&#xff0c;源启已经走上了她第三年的征途。今天&#xff0c;源启已经成为公司战略的支点&#xff0c;中电金信正致力于用“源启底座”“源启咨询”“源启应用重构”三位一体的方式来赋能千行百业数智化…

海康私有化视频平台EasyCVR视频分析设备平台流媒体协议RTMP、HTTP-FLV、HLS的简单对比

在当今的数字化世界中&#xff0c;视频流协议的选择对于确保流畅、高效的视频传输至关重要。随着互联网技术的快速发展&#xff0c;直播和视频点播服务已经成为人们日常生活中不可或缺的一部分。无论是安防监控、在线教育、远程会议还是娱乐直播&#xff0c;用户对于视频流的实…