RabbitMQ 消息队列(Spring boot AMQP)

news2024/11/28 2:52:21

文章目录

  • 🍰有几个原因可以解释为什么要选择 RabbitMQ:
    • 🥩mq之间的对比
      • 🌽RabbitMQ vs Apache Kafka
      • 🌽RabbitMQ vs ActiveMQ
      • 🌽RabbitMQ vs RocketMQ
      • 🌽RabbitMQ vs Redis
    • 🥩linux docker 部署 rabbitmq
    • 🥩Springboot AMQP RabbitMQ发送消息示例
      • 🌽Basic Queue 简单队列模型
        • 🌽消息发送
        • 🌽消息接收
    • 🥩在使用MQ(消息队列)时,需要注意以下几个问题
      • 🌽1. 消息丢失:
      • 🌽2. 消息顺序:
      • 🌽3. 幂等性:
      • 🌽4. 性能和吞吐量:
      • 🌽5. 容错性和可靠性:
      • 🌽6. 监控和调优:

🍰有几个原因可以解释为什么要选择 RabbitMQ:


  1. 灵活性和可靠性:RabbitMQ 提供了丰富的消息传递模型和功能,使开发者能够设计出灵活而复杂的消息路由机制。它还提供了可靠的消息传递机制,包括消息确认、持久化等,确保消息的可靠传递。

  2. 可扩展性和高性能:RabbitMQ 具备良好的水平扩展能力,可以轻松处理大量的并发连接和高吞吐量。它的性能表现稳定,并且在大规模部署中经得起考验。

  3. 协议支持和跨平台兼容性:RabbitMQ 基于 AMQP(Advanced Message Queuing Protocol)标准,并支持多种编程语言和平台。这意味着您可以使用多种语言和技术栈来与 RabbitMQ 进行交互,从而方便地集成到您的现有系统中。

  4. 社区支持和稳定性:RabbitMQ 是一个广受欢迎的开源项目,拥有活跃的社区支持和持续的更新。它已经经过多年的稳定运行和广泛应用,在很多大型企业和组织中被广泛信赖。

  5. 丰富的功能和插件:RabbitMQ 提供了许多有用的功能和插件,如消息优先级、延迟队列、RPC(Remote Procedure Call)等。这些功能可以根据具体需求进行配置和扩展,使得 RabbitMQ 更加灵活且适用于各种场景。

  6. 管理和监控:RabbitMQ 提供了直观的管理界面,方便您管理队列、交换机、绑定等,并监控关键性能指标和健康状态。这使您能够方便地查看和管理消息传递的整个过程。


  • 总而言之,选择 RabbitMQ 的原因是它提供了一个可靠、灵活且功能强大的消息传递解决方案。它广泛应用于企业集成、异步任务处理、实时数据流处理等各种场景。
  • 当然,在选择消息队列解决方案时,您还需要考虑其他因素,如团队经验、技术栈兼容性等。但基于其特点和广泛的应用,RabbitMQ 是一个值得考虑且常见的选择。
  • 当涉及到消息队列(Message Queue,简称 MQ)时,RabbitMQ 是其中一个广为人知且流行的解决方案。以下是 RabbitMQ 和其他 MQ 解决方案之间的一些比较:

🥩mq之间的对比


几种常见MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

🌽RabbitMQ vs Apache Kafka


  • 消息模型:RabbitMQ 使用点对点和发布/订阅模型,而 Kafka 则是一个高吞吐量的分布式消息系统,适用于流处理、事件驱动和日志传输。
  • 可靠性:RabbitMQ 提供了丰富的可靠性机制,如消息确认和持久化。而 Kafka 通过数据复制和分区副本保障消息的持久性和容错性。
  • 延迟:RabbitMQ 在低延迟的场景下表现更好,适合需要实时处理的应用程序。Kafka 更适合大规模的实时数据流处理,但相对有较高的延迟。
  • 扩展性:Kafka 具备更好的水平扩展能力,可以轻松处理大量的并发连接和高吞吐量。
  • 使用场景:RabbitMQ 适用于传统的企业应用集成、任务调度等场景;Kafka 更适用于大规模的数据管道、日志聚合和实时流处理。

🌽RabbitMQ vs ActiveMQ


  • 协议支持:RabbitMQ 实现了 AMQP 协议,而 ActiveMQ 支持多种协议,包括 AMQP、STOMP、OpenWire 等。
  • 性能:RabbitMQ 在吞吐量方面表现更优,尤其在高并发和大规模消息交换的场景下。ActiveMQ 相对较慢,但对于中小型应用仍然具备足够的性能。
  • 可靠性:RabbitMQ 提供了丰富的可靠性机制,如消息确认和持久化。ActiveMQ 也提供了持久化、事务等机制来保证消息的可靠传递。
  • 功能和插件:RabbitMQ 提供了更多的功能和插件,例如消息优先级、RPC、延迟队列等。ActiveMQ 也有类似的功能,但相对较少一些。

🌽RabbitMQ vs RocketMQ


RabbitMQ和RocketMQ是两个流行的消息系统,用于构建分布式和可扩展的应用程序。虽然它们有相似的目标,但在它们之间存在几个区别,可以帮助您决定哪个更适合您特定的使用场景。

1. 开源性: RabbitMQ是用Erlang编写的开源消息代理,而RocketMQ也是由阿里巴巴集团开发的开源分布式消息系统,使用Java编写。这两个项目都有活跃的社区,并定期进行更新。

2. 语言支持: RabbitMQ为多种编程语言提供官方客户端库,包括Java、Python、Ruby、.NET等。另一方面,RocketMQ本地支持Java客户端,但也有由社区支持的其他语言(如Go、Python和C++)的客户端库。

3. 消息模式: RabbitMQ主要专注于支持AMQP(高级消息队列协议),并支持广泛的消息模式,如发布/订阅、请求/回复和工作队列。RocketMQ设计用于高吞吐量、低延迟的场景,并针对流式处理和事件驱动架构进行了优化。它支持发布/订阅、点对点和请求/回复消息模式。

4. 可扩展性和性能: RabbitMQ和RocketMQ都具有高度的可扩展性,但RocketMQ专门设计用于处理大量低延迟的消息。它通过消息批处理、消息压缩和分布式架构等功能实现这一点。如果您需要高性能的大规模消息传递,RocketMQ可能更合适。

5. 数据持久化: RabbitMQ默认将消息存储在磁盘上,即使代理重新启动也能确保持久性。相比之下,RocketMQ依靠预写日志和副本来实现容错和数据持久化。

6. 社区和生态系统: 作为一个流行的消息系统,RabbitMQ拥有成熟的社区和丰富的插件和集成生态系统。RocketMQ拥有不断增长的社区,并在中国市场上更常见,重点在于阿里巴巴的生态系统。

最终,在RabbitMQ和RocketMQ之间的选择取决于您的具体需求。如果您需要强大的语言支持、丰富的生态系统和灵活的消息模式,请选择RabbitMQ。另一方面,如果您优先考虑高吞吐量、低延迟和原生Java集成,请选择RocketMQ。

🌽RabbitMQ vs Redis


  • 数据类型:Redis 是一个内存数据库,具有键值存储、列表、集合等数据结构,同时也支持发布/订阅模式。RabbitMQ 则专注于消息队列的功能。
  • 消息传递模型:RabbitMQ 提供了丰富的消息传递模型,更适合复杂的消息路由和消费者管理。Redis 的发布/订阅模式更适合简单的发布和订阅场景。
  • 持久化:RabbitMQ 提供了可靠的消息持久化机制,适用于需要持久化的消息传递。Redis 也可以通过持久化机制来保留数据,但主要关注于内存数据库的性能。
  • 性能:Redis 是一个非常快速的内存数据库,适用于低延迟和高吞吐量的场景。RabbitMQ 的性能也很好,但相对 Redis 来说稍慢一些。

这些比较提供了一些关键区别,但选择合适的 MQ 解决方案还应基于具体的使用案例、需求和性能要求。每个解决方案都有其优势和适用场景,因此您可能需要根据自己的情况进行评估和选择。
在 Redis 中,订阅和发布是一种基于发布/订阅模式的消息传递机制。通过使用 Redis 提供的 PUBLISH 命令进行消息发布,以及使用 SUBSCRIBE 命令进行消息订阅,您可以实现简单而强大的消息传递功能。以下是 Redis 订阅和发布的详细步骤:

🥩linux docker 部署 rabbitmq

docker怎么拉镜像已经写过很多遍了,还是不清楚可以看之前的例子https://blog.csdn.net/qq_39017153/article/details/131976173?spm=1001.2014.3001.5501

拉去镜像

docker pull rabbitmq

15672(UI页面通信口,浏览器界面)、5672(client端通信口,最常用到的)、25672(server间内部通信口)、61613(stomp 消息传输)、1883(MQTT消息队列遥测传输)

创建挂载目录

mkdir -p /opt/rabbitmq/data
mkdir -p /opt/rabbitmq/conf
mkdir -p /opt/rabbitmq/log

还是一样给你创建文件授权 我这里怕麻烦直接给的最大

chmod -R 777 /opt/rabbitmq

运行镜像

docker run \
-p 5672:5672 -p 15672:15672 \
--name rabbitmq \
--hostname my-rabbit \
-v /opt/rabbitmq/data:/var/lib/rabbitmq \
-v /opt/rabbitmq/conf:/etc/rabbitmq \
-v /opt/rabbitmq/log:/var/log/rabbitmq \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-d rabbitmq:latest

安装可视化界面插件 : 进入容器

docker exec -it rabbitmq bash

进入容器后执行安装插件命令 ,执行完成 访问 ip+15672 即可访问

rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

🥩Springboot AMQP RabbitMQ发送消息示例

SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。
SpringAmqp的官方地址:https://spring.io/projects/spring-amqp

在这里插入图片描述
在这里插入图片描述
SpringAMQP提供了三个功能:

自动声明队列、交换机及其绑定关系
基于注解的监听器模式,异步接收消息
封装了RabbitTemplate工具,用于发送消息

🌽Basic Queue 简单队列模型


下面是一个使用Spring Boot和RabbitMQ的基本示例:

首先,确保你已经在项目中引入了Spring Boot和RabbitMQ的依赖。

<!-- pom.xml -->
<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- RabbitMQ Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
</dependencies>

🌽消息发送

接下来,配置RabbitMQ连接和相关属性。

# application.yml
spring:
  rabbitmq:
    host: 192.168.xxx.xxx # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: itcast # 用户名
    password: 123321 # 密码
   listener:
      simple:
        prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息 

创建发送消息的生产者。

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

@Component
public class MessageProducer {
    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public MessageProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend("my-exchange", "my-routing-key", message);
    }
}

🌽消息接收


创建接收消息的消费者。

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);
    }
}

最后,在启动类上添加注解@EnableRabbit,以启用RabbitMQ相关功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableRabbit
public class RabbitMQDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitMQDemoApplication.class, args);
    }
}

通过以上示例,你已经完成了一个简单的Spring Boot和RabbitMQ集成的应用程序。当调用MessageProducersendMessage()方法时,消息将会发送到名为"my-queue"的队列中,并被MessageConsumerreceiveMessage()方法接收和处理。

🥩在使用MQ(消息队列)时,需要注意以下几个问题


🌽1. 消息丢失:


  • 解决方案:
    • 开启消息持久化:将消息保存到持久化存储介质(如磁盘)中,以确保即使在系统故障或重启后,消息也能够被恢复。
    • 设置合适的消息超时时间:根据业务需求,合理设置消息的过期时间,避免长期滞留的消息占用资源。
    • 使用备份和冗余机制:在分布式环境下,可以使用主备架构、多副本复制等机制来保障消息的可靠性。

🌽2. 消息顺序:


  • 解决方案:
    • 使用单一消息队列:为了确保消息的有序处理,可以使用单一消息队列,使消息按照先后顺序进行处理。
    • 对消息进行分区:如果需要水平扩展,可以将消息划分为多个分区,并根据分区进行顺序处理。

🌽3. 幂等性:


  • 解决方案:
    • 唯一标识符:为每条消息生成唯一的标识符,在消息处理前检查该标识符是否已经处理过,避免重复消费。
    • 幂等性校验:记录已处理的消息ID或内容,并在每次接收到消息时进行查重,确保同一消息不会被处理多次。
    • 事务性处理:将消息的处理逻辑与更新数据库、缓存等操作放在同一个事务中,并通过回滚事务来避免重复处理。

🌽4. 性能和吞吐量:


  • 解决方案:
    • 优化代码逻辑:合理设计消息生产者和消费者的代码逻辑,减少不必要的网络通信或资源占用。
    • 合理配置MQ参数:根据系统需求,调整MQ的配置参数,如队列长度、批量发送等,以提高性能和吞吐量。
    • 水平扩展:通过增加消息队列的实例或增加消费者线程数等方式,实现水平扩展,提升处理能力。

🌽5. 容错性和可靠性:


  • 解决方案:
    • 主备架构:使用主备模式,当主节点故障时,自动切换到备份节点,确保消息服务的高可用性。
    • 多副本复制:将消息队列的内容复制到多个节点上,实现数据的冗余备份,确保数据的安全性和可靠性。

🌽6. 监控和调优:


  • 解决方案:
    • 实时监控:配置监控系统,实时监测消息的发送和消费情况,及时发现异常并进行处理。
    • 性能调优:定期进行性能分析和调优,根据监控数据调整配置参数,提升系统的性能和吞吐量。

综上所述,针对MQ使用中需要注意的问题,我们提供了相应的解决方案。根据具体的业务需求和系统环境,可以结合这些解决方案来确保消息队列的稳定运行和可靠性。

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

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

相关文章

v-md-editor自定义锚点(生成目录)数组转树结构

接前两篇博文&#xff0c;最终方案终于定了&#xff0c;也把之前做的编辑器模式给否决了&#xff0c;原因是系统中有老的文档需要平替&#xff0c;因此就不能通过编辑器这种模式了&#xff0c;太麻烦了。 最终方案&#xff1a;线下手动pandoc word转markdown&#xff0c;然后将…

Nginx安装和配置文件详解

目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…

【雕爷学编程】Arduino动手做(13)---TTP223B电容式触摸模块之通过串口监视器检测电容触摸键的状态与控制继电器

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

学习three.js —— 第一天

1.创建三要素 场景 // 创建场景 const scene new THREE.Scene() 相机 // 创建透视相机 const camera new THREE.PerspectiveCamera(a,b,c,d) // 参数含义 // a:相机可视垂直角度&#xff1b;b:相机可视长宽比&#xff1b;c&#xff1a;近端距离&#xff1b;d&#xff1a;远端…

YOLOv5改进系列(19)——替换主干网络之Swin TransformerV1(参数量更小的ViT模型)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

小结:基于 JavaWeb 的宠物店管理系统

宠物店管理系统 系统介绍系统展示登录界面用户注册页面 店主主界面宠物信息管理页面修改宠物信息 宠物出入库管理页面宠物订单查询页面宠物账单查看页面用户信息管理页面修改用户信息 用户主界面宠物订购页面用户订购支付页面 个人资料编辑页面个人订单查看页面 系统说明开发环…

尚硅谷大数据项目《在线教育之采集系统》笔记005

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P057 P058 P059 P060 P061 P062 P063 P064 P065 P066 P067 P068 P069 P070 P071 P072 P073 P057 #!/bin/bashMAXWELL_HOME/opt/module/maxwell/maxwell-1.29.2status_ma…

虚拟机的创建与使用

一、虚拟机的下载 链接&#xff1a;百度网盘下载链接 提取码&#xff1a;a9p4 二、新建虚拟机系统 需要有版本序列号 注意: 选择 第一个是纯dos 的窗口指令 桌面没有任何东西 选择第二个就是正常的操作系统.有文件夹 我的电脑之类的 三、从主机中复制文件到虚拟机中需要安装 …

【自用】JAVA复习(初级到循环 0-156集):break、while、for、continue、return

总览 1.break 2.while 3.for 4.continue 5.return 一、break 1.作用 跳出当前的循环。 2.break 在多重循环中的使用&#xff1a;配合标签使用 二、while 三、for 1.for( ; ; )、for( ; i<10 ; ) 四、continue 1.作用 用于结束本次循环&#xff0c;开始下一次循环 …

C语言笔试训练【第九天】

文章目录 &#x1f47f;1、下列程序的输出是&#xff08; &#xff09;&#x1f48e;2、二维数组X按行顺序存储&#xff0c;其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为&#xff08; &#xf…

软件外包开发的VUE开发框架

Vue.js&#xff08;通常简称为Vue&#xff09;是一个流行的渐进式JavaScript框架&#xff0c;用于构建用户界面。它的核心库专注于视图层&#xff0c;但也可以结合其他库和工具来构建完整的单页面应用&#xff08;SPA&#xff09;。以下分享Vue.js的开发框架和特点&#xff0c;…

春秋云镜 CVE-2022-0948

春秋云镜 CVE-2022-0948 WordPress plugin Order Listener for WooCommerce SQLI 靶标介绍 WordPress 插件 Order Listener for WooCommerce 3.2.2 之前版本存在 SQL注入漏洞。 启动场景 漏洞利用 EXP curl http://example.com/?rest_route/olistener/new --data {"…

分布式学习最佳实践:从分布式系统的特征开始

正文   在延伸feature&#xff08;分布式系统需要考虑的特性&#xff09;的时候&#xff0c;我逐渐明白&#xff0c;这是因为要满足这些feature&#xff0c;才设计了很多协议与算法&#xff0c;也提出了一些理论。比如说&#xff0c;这是因为要解决去中心化副本的一致性问题&…

SCAU操作系统知识点之(六)并发:死锁和饥饿

1、死锁原因&#xff1a;竞争资源、进程推进顺序不当 2、资源分配图&#xff08;若死锁&#xff0c;则资源分配图中必有环路&#xff0c;但有环路时不一定死锁&#xff09; 3、死锁的四个必要条件 ①互斥 ②占有且等待 ③不可抢占 ④循环等待 在死锁的四个必要条件中&#xff…

jupyter默认工作目录的更改

1、生成配置文件&#xff1a;打开Anaconda Prompt&#xff0c;输入如下命令 jupyter notebook --generate-config询问[y/N]时输入y 2、配置文件修改&#xff1a;根据打印路径打开配置文件jupyter_notebook_config.py&#xff0c;全文搜索找到notebook_dir所在位置。在单引号中…

Vue组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…

python使用matplot库绘图颜色表

matlpot的color参数可以是十六进制&#xff0c;也可以是颜色描述的字符串。 下面是字符串描述的颜色表。为了颜色间要有区分度。同时要求颜色比较明显&#xff0c;特意选择一些比较有代表性的颜色&#xff0c;以供使用&#xff08;颜色由于个人需要&#xff0c;除去了红色和绿…

SpringBoot启动图标替换-banner文件

1.banner.txt文件内容如下 ${AnsiColor.BRIGHT_YELLOW}${AnsiStyle.BOLD}_________ .__ __________ __ / _____/____________|__| ____ ____\______ \ ____ _____/ |_ \_____ \\____ \_ __ \ |/ \ / ___\| | _//…

实践|Linux 中查找和删除重复文件

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您习惯使用下载管理器从互联网上下载各种内容&#xff0c;那么组织您的主目录甚至系统可能会特别困难。 通常&#xff0c;您可能会发现您下载了相同的 mp3、pdf 和 epub&#xff08;以及各种其他文件扩展名&#xff09;并将…

tkinter文件对话框

文章目录 文件对话框文件对象文件类型其他参数 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框扫雷小游戏&#x1f48e;强行表白神器 文件对话框 filedialog提供了多种与文件交互相关的对话框&#xff0c…