# 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 {

    @Autowired
    private RabbitTemplate rabbitTemplate;

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

    @Autowired
    private 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,可以显著提高系统的稳定性和性能,简化系统的开发和维护工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-利用os,tkinter库编写一个伪恶意程序文件(Pro版)

前言&#xff1a;上一期我们简单学习了如何编写一个多次弹窗警告用户的exe伪恶意文件。我们知道了把Python初始文件编译为exe文件后&#xff0c;程序在没有Python环境的情况下也能正常运行。我们上次编写的程序仅仅只是伪造系统正在执行关机命令前的倒计时的假象&#xff0c;实…

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

字节青训-小S的倒排索引

问题描述 小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子&#xff0c;小S决定使用倒排索引。倒排索引的工作原理是&#xff1a;每个单词都会关联一个帖子ID的列表&#xff0c;这些帖子包含该单词&#xff0c;且ID按从小到大的顺序排列。 例…

你需要了解的正则表达式相关知识

正则表达式&#xff08;Regular Expression&#xff0c;简称 regex 或 regexp&#xff09;是一种用于匹配字符串的模式。它广泛应用于文本查找、替换、验证等场景&#xff0c;尤其是在数据处理、网络爬虫、编程等领域非常有用。下面将详细介绍正则表达式的基本语法、常用元字符…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

【C++进阶】智能指针的使用和原理(2)

5. shared_ptr和weak_ptr 5.1 shared_ptr循环引用问题 shared_ptr大多数情况下管理资源⾮常合适&#xff0c;⽀持RAII&#xff0c;也⽀持拷贝。但是在循环引⽤的场景下会导致资源没得到释放内存泄漏&#xff0c;所以我们要认识循环引用的场景和资源没释放的原因&#xff0c;并…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;或者是第三方公司提供的是Android的库&#xff0c;这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种&#xff0c;Module模…

linux进程的状态之环境变量

我们在前面了解了进程的状态及相关概念 接下来我们接着上一篇进程的状态接着了解环境变量 进程的状态 文章目录 目录 文章目录 前言 二、环境变量 1、常见环境变量 2、查看环境变量 3、修改PATH 4、HOME 5、PATH ​编辑 6、和环境变量相关的命令 三、环境变量的组织…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像&#xff0c;并通过深度学习的OCR&#xff08;光学字符识别&#xff09;识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别&#xff0c;需要以下几个基本步骤&…

AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。

2024-10-31&#xff0c;由清华大学和北京大学共同创建的AndroidLab数据集&#xff0c;为安卓自主代理的训练和评估提供了一个包含操作环境、行动空间和可复现基准的系统框架&#xff0c;这对于推动安卓代理技术的发展具有重要意义。 数据集地址&#xff1a;Android Instruct|A…

使用axois自定义基础路径,自动拼接前端服务器地址怎么办

请求路径&#xff1a; http://localhost:5173/http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head 很明显多拼接了路径地址 查看基础路径文件发现&#xff1a; //axios基础封装 import axios from axiosconst httpInstance axios.create({baseURL: /h…

Densenet模型花卉图像分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】

Mysql NDB Cluster 集群(CentOS 7)安装笔记 NDB集群核心概念 NDBCLUSTER(也称为NDB)是一个内存存储引擎,提供高可用性和数据保存功能。 NDBCLUSTER存储引擎可以配置一系列故障转移和负载平衡选项,但从集群级别的存储引擎开始是最容易的。NDB集群的NDB存储引擎包含一整套…

Pattern program MPAT 详解

本文为VIP文章,主要介绍Pattern中元素与格式、常用指令、地址&数据产生指令等。 目录 一、pattern概述 二:Pattern构成元素 1、pattern构成元素:MPAT、END 2、pattern构成元素:pattern file name 3、pattern构成元素:SDEF 4、Pattern构成元素:REGISETR 5、Pa…

【通义灵码】AI编码新时代

目录 一.初识灵码&#xff0c;开启新篇 安装 登录 二.灵码相伴&#xff0c;探索新境 实时续写 自然生成 单元测试生成 解释代码 优化建议 快捷键 三.智慧流转&#xff0c;高效开发 驱动移植 LVGL框架 项目总结 四.融合创新&#xff0c;携手同行 一.初识灵码&#…

RabbitMQ客户端应用开发实战

这一章节我们将快速完成RabbitMQ客户端基础功能的开发实战。 一、回顾RabbitMQ基础概念 这个RabbitMQ的核心组件&#xff0c;是进行应用开发的基础。 二、RabbitMQ基础编程模型 RabbitMQ提供了很多种主流编程语言的客户端支持。这里我们只分析Java语言的客户端。 上一章节提…

PySide6百炼成真(2)

文章目录 1.简单的登录页面2.简单的计算器 本篇根据前面所学做两个小demo 制作一个简单的登录页面制作一个计算器 因为还没有学习布局流等,所以就只能拖拉到设计师中. 1.简单的登录页面 下面就到计算器了,在图形界面中计算器就跟我们编程语言的hello,world一样,所以一定要自己…

群控系统服务端开发模式-应用开发-上传工厂开发

现在的文件、图片等上传基本都在使用oss存储。而现在常用的oss存储有阿里云、腾讯云、七牛云、华为云等&#xff0c;但是用的最多的还是前三种。而我主要封装的是本地存储、阿里云存储、腾讯云存储、七牛云存储。废话不多说&#xff0c;直接上传设计图及说明&#xff0c;就一目…

服务器被病毒入侵如何彻底清除?

当服务器遭遇病毒入侵时&#xff0c;彻底清除病毒是确保系统安全和数据完整性的关键步骤。这一过程不仅需要技术上的精准操作&#xff0c;还需要严密的计划、合理的资源调配以及后续的防范措施。以下是一篇关于如何在服务器被病毒入侵时彻底清除病毒的详细指南。 一、初步响应与…

修改 title标题图标

路径 \web\views\webclient_templates.xml \web\static\src\webclient\webclient.js 再升级web模块