RabbitMQ基本使用及企业开发中注意事项

目录

一、基本使用

二、使用注意事项

1. 生产者重连机制 - 保证mq服务是通的

2. 生产者确认机制 - 回调机制

3. MQ的可靠性

4. Lazy Queue模式

5. 消费者确认机制


一、基本使用

部署完RabbitMQ有两种使用方式:

  • 网页客户端
  • Java代码

MQ组成部分:

  • 虚拟主机 -> 进行数据隔离的,好比mysql中的不同数据库
  • 交换机 -> 进行路由转发消息
    • fanout:最普通 相当于广播
    • topic:可依key绑定不同队列,可使用.分割key,并支持模糊匹配
    • direct:可依key绑定不同队列,不支持模糊匹配
  • 队列 -> 接受交换机转发过来的消息

Java中使用(注解开发):

1.引依赖和配置属性 - 版本选个差不多的 我是继承的springboot的

        <!--AMQP依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
spring:
  rabbitmq:
    host: 192.168.189.189
    port: 5672
    virtual-host: hmallVir
    username: hmall
    password: 123321

2.使用RabbitTemplate发消息

@SpringBootTest
public class TestSendMs {
    @Autowired
    RabbitTemplate rabbitTemplate;

    @Test
    void testSend1(){
        String queueName = "hmallQueue1";
        String ms = "hello";
        rabbitTemplate.convertAndSend(queueName, ms);
    }

}

3.使用RabbitListerner接受消息

@Component
public class MyListeners {

    @RabbitListener(queues = "hmallQueue1")
    public void listenerMs1(String ms) throws InterruptedException {
        System.out.println("消费者1接收到消息  ->  " + ms);
        Thread.sleep(20);
    }

}

4.声明队列和交换机的方式二(简单常用)

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "hmallQueue1"),
            exchange = @Exchange(name = "hmall", type = ExchangeTypes.DIRECT),
            key = {"red", "blue"}
    ))
    public void listenDirectQueue1(String msg){
        System.out.println("消费者1接收到消息 -> " + msg);
    }

轮询接受消息问题:

队列读取消息时使用轮询机制,每个队列都读取相同的消息数量,这样不好,我们要针对队列处理消息的能力,需要在配置文件设置属性fetch

spring:
  rabbitmq:
    host: 192.168.189.189
    port: 5672
    virtual-host: hmallVir
    username: hmall
    password: 123321
    listener:
      simple:
        prefetch: 1 # 每次处理完消息再获取新的消息 性能越好处理消息越多

扩展消息转换器:

默认的消息转换器是直接将对象序列化为Byte[],即读不懂又不安全还占内存

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
    @Bean
    public MessageConverter jacksonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

二、使用注意事项

1. 生产者重连机制 - 保证mq服务是通的

连接重试,注意这里是阻塞式的,意味着连接失败会一直重试其他业务不会执行,所以建议禁用此模式。

spring:
  rabbitmq:
    host: 192.168.189.189
    port: 5672
    virtual-host: hmallVir
    username: hmall
    password: 123321
    connection-timeout: 1s # 连接失败重试
    template:
      retry:
        enabled: true # 开启重试机制
        initial-interval: 1000ms # 失败后的初始等待时间
        multiplier: 1 # 失败后下次的等待市场倍数
        max-attempts: 3 # 最大重试次数
2. 生产者确认机制 - 回调机制

SpringAMQP生产者确认机制的返回值情况?

  1. ack 消息成功投递到mq
    1. 交换机收到了 没有路由转发到队列 ack + return路由异常
    2. 交换机收到并路由成功 只ack
  2. nack 消息丢失 投递失败
3. MQ的可靠性

服务一旦挂了消息就都没有了,还有就是内存如果满了,会触发阻塞式的强制持久化操作,这会导致这段时间处理消息的能力为0

  1. 设置消息的持久化属性:需要将delivery_mode属性设置为2。这个设置会将消息标记为持久化,确保消息被写入磁盘而不是仅保存在内存中。
  2. 声明持久化的队列:在RabbitMQ中声明队列时,需要将durable属性设置为true。这样,队列的元数据以及队列中的消息都会被持久化到磁盘上。需要注意的是,即使队列被设置为持久化,也不能保证内部所存储的消息不会丢失,因为RabbitMQ默认在消息被消费后立即删除它。要确保消息不被删除,需要在消费时进行相应的设置。
  3. 声明持久化的交换机:与队列类似,交换机也可以被设置为持久化。在声明交换机时,将durable属性设置为true,就可以将交换机标记为持久化。如果交换机不设置持久化,那么在RabbitMQ服务重启之后,相关的交换机元数据会丢失,但已发送的消息不会丢失,只是不能再将新的消息发送到这个交换机中。
4. Lazy Queue模式
  1. 降低内存压力:在高负载情况下,大量消息堆积可能导致内存压力剧增。使用Lazy Queue模式,消息直接写入磁盘,可以有效降低内存使用,避免内存溢出等问题。
  2. 支持大量消息存储:由于消息存储在磁盘上,Lazy Queue模式可以支持数百万条消息的存储,满足大规模消息处理的需求。
  3. 提高系统稳定性:通过将消息持久化到磁盘,Lazy Queue模式增强了消息的可靠性,即使RabbitMQ服务器发生故障或重启,消息也不会丢失,保证了系统的稳定性和数据的完整性。


5. 消费者确认机制

这里就是模拟事务嘛,利用AOP思想

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

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

相关文章

uniapp开发笔记----配置钉钉小程序

uniapp开发笔记----配置钉钉小程序 1. 项目根目录添加package.json文件2. 之后点击运行就可以看到已经添加了钉钉小程序3. 如果首次使用需要配置 其他功能待开发。。。 接上一章之后&#xff0c;我想要把项目配置成钉钉小程序 官方文档点击这里 1. 项目根目录添加package.json…

专业140+总410+国防科技大学831信号与系统考研经验国防科大电子信息与通信,真题,大纲,参考书。

应群里同学要求&#xff0c;总结一下我自己的复习经历&#xff0c;希望对大家有所借鉴&#xff0c;报考国防科技大学&#xff0c;专业课831信号与系统140&#xff0c;总分410&#xff0c;大家以前一直认为国防科技大学时军校&#xff0c;从而很少关注这所军中清华&#xff0c;现…

第七篇:3.6 其他评估考虑/4.审计指南/5. 通用报告规范/6.披露指南、参考标准及其他 - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇 …

【网络】什么是RPC

RPC 是Remote Procedure Call的缩写&#xff0c;译为远程过程调用。是一个计算机通信协议。 1、为什么需要远程调用 在如何给女朋友解释什么是分布式这一篇文章中介绍过&#xff0c;为了提升饭店的服务能力&#xff0c;饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切…

Mac清理缓存哪些文件夹可以清理 Mac清理缓存怎么操作 Mac清理缓存快捷键 cleanmymac值不值得买

缓存文件属于电脑临时保存数据的一种文件&#xff0c;它的存在可以帮助电脑快速打开网页&#xff0c;减少缓存的时间。但是如果用户不主动清除这些缓存&#xff0c;时间一长它们会占用磁盘空间&#xff0c;影响系统性能和稳定性。因此&#xff0c;养成定期给Mac做内存缓存垃圾清…

C++奇迹之旅:我与类和对象相遇

文章目录 &#x1f4dd;面向过程和面向对象初步认识&#x1f320; 类&#x1f309;类的引入&#x1f309;类的定义 &#x1f320;类的访问限定符&#x1f320;访问限定符 &#x1f320;类的两种定义方式&#x1f309;封装 &#x1f6a9;总结 &#x1f4dd;面向过程和面向对象初…

python+django+flask+vue贫困地区儿童资助网站22pk7

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 一开始&#xff0c;本文就对系统内谈到的基本知识&#xff0c;从整体上进行了描述&#xff0c…

【鸿蒙开发】系统组件Row

Row组件 Row沿水平方向布局容器 接口&#xff1a; Row(value?:{space?: number | string }) 参数&#xff1a; 参数名 参数类型 必填 参数描述 space string | number 否 横向布局元素间距。 从API version 9开始&#xff0c;space为负数或者justifyContent设置为…

万界星空科技工时管理系统功能介绍

一、工时管理系统的功能 1、工时记录与统计 工时管理系统提供了便捷的工时记录和统计功能。员工可以通过系统记录每天的上班时间、下班时间以及休息时间&#xff0c;系统会自动计算工作时长并生成工时统计报表。这一功能不仅能够准确记录员工的工作时间&#xff0c;还能够帮助…

基于大数据的汽车信息可视化分析预测与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目通过集成网络爬虫技术&#xff0c;实时获取海量汽车数据&#xff1b;运用先进的ARIMA时序建模算法对数据进行深度挖掘和分析&#xff1b;结合flask web系统和echarts可视化工具&#xff0c;…

如何在Rust中操作JSON

❝ 越努力&#xff0c;越幸运 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。 前言 我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中有过在Rust项目中如何操作JSON。 由于文章篇幅的原因&#xff0c;我们就没详细介绍…

QT 使用redis ,连接并使用

一.redis安装 链接&#xff1a;https://pan.baidu.com/s/17fXKOj5M4VIypR0y5_xtHw 提取码&#xff1a;1234 1.下载得到文件夹如图 course_redis为安装包。 2.启动Redis服务 把安装包解压到某个路径下即可。 打开cmd窗口&#xff0c;切换到Redis安装路径&#xff0c;输入 r…

微服务初始及Eureka注册中心

1&#xff0c;架构演变 单体架构&#xff1a;将所有业务功能集中在一个项目中开发&#xff0c;达成一个包部署 优点&#xff1a;架构简单&#xff0c;部署成本低 缺点&#xff1a;项目耦合度高 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c;每个业务作为独…

Codeforces Round 938 (Div. 3) A - F 题解

A. Yogurt Sale 题意&#xff1a;要购买n个酸奶&#xff0c;有两种买法&#xff0c;一种是一次买一个&#xff0c;价格a。一种是一次买两个&#xff0c;价格b&#xff0c;问买n个酸奶的最小价格。 题解&#xff1a;很容易想到用2a和b比较&#xff0c;判断输出即可。 代码&am…

小程序开发SSL证书下载和安装

在开发小程序时&#xff0c;确保数据的安全传输至关重要&#xff0c;而实现这一目标的关键在于正确获取与安装SSL证书。以下详细介绍了从获取到安装SSL证书的完整流程&#xff0c;以助您为小程序构建可靠的加密通信环境。 一、小程序SSL证书类型选择&#xff1a; 域名验证型D…

【PyTorch][chapter 25][李宏毅深度学习][Transfer Learning-1]

前言&#xff1a; 迁移学习是一种机器学习的方法,指的是一个预训练的模型被重新用在另一个任务中。 比如已经有个模型A 实现了猫狗分类 模型B 要实现大象和老虎分类,可以利用训练好的模型A 的一些参数特征,简化当前的训练 过程. 目录&#xff1a; 简介 Model Fine-Tuning (…

【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

目录 前言 什么是面向对象&#xff1f; 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 前言 最早的C版本&#xff08;C with classes&#xff09;中&#xff0c;最先加上的就是类的机制&#xff0c;它构成…

Day3-HBase重要概念

HBase 结构 HRegion 概述 在HBase中&#xff0c;会从行键方向上对表来进行切分&#xff0c;切分出来的每一个结构称之为是一个HRegion 切分之后&#xff0c;每一个HRegion会交给某一个HRegionServer来进行管理。HRegionServer是HBase的从节点&#xff0c;每一个HRegionServ…

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言 昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章&#xff0c;今天来讲下另外一种方式&#xff0c;不需要RabbitMQ的插件。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和R…

Spring Cloud微服务入门(四)

应用容错的概念 应用错误-雪崩效应 定义&#xff1a; 服务雪崩效应是一种因“服务提供者的不可用”&#xff08;原因&#xff09;导致“服务调用者不可用”&#xff08;结果&#xff09;&#xff0c;并将不可用逐渐放大的现象。 服务雪崩的过程可以分为三个阶段&#xff1a; 服…