关于RabbitMQ你了解多少?

关于RabbitMQ你了解多少?

文章目录

  • 关于RabbitMQ你了解多少?
    • 基础篇
      • 使用消息队列
      • RabbitMQ
      • RabbitMQ 7种用法类型
      • Exchange 交换机
    • 进阶篇
      • 目录
      • 客户端整合SpringBoot
      • 消息可靠性投递
      • 消费端限流
      • 消息超时
      • 死信和死信队列
      • 延迟队列
      • 事务消息
      • 惰性队列
      • 优先级队列
    • 集群篇
      • 工作机制
      • 集群搭建
      • 负载均衡
      • 仲裁队列
      • 流式队列
      • 异地容灾
    • 完整笔记总结

RabbitMQ是目前企业中应用非常广泛的高性能的异步通讯组件

基础篇

基础篇回顾

使用消息队列

  • 同步功能耦合度高,异步功能解耦
  • 同步响应时间长,响应总长,异步快速响应
  • 同步并发压力传递,异步削峰限流
  • 同步系统结果弹性不足,牵一发动全身,异步功能便于扩展

RabbitMQ

  • 消息的发送端,生产者 Producer,和消息的接收端,消费者 Consumer
  • 生产者发送消息给消费者建立连接,Connection,建立连接TCP三次握手,为实现Connection复用,在Connection中建立逻辑连接 Channel ,实际每次连接使用的是Connection中的Channel完成
  • Broker就是RabbitMQ的主体,服务器本身,负责接收和分发消息,集群就是多个Broker
  • 在Broker实例里面可根据划分多个逻辑上的分组,每个分组叫 Virtual Host,其中包含 Exchange 交换机,是消息到达Broker的第一站,之后发送到 Queue 队列上,队列是消息的容器,消息放在这里等待被消息取走
  • 消息在交换机中只是中转,不去存储消息,存储消息需在队列中,消息发送到哪一个队列是需要 Binding 绑定关系,通过路由键方式将交换机和队列绑定到一起

RabbitMQ 7种用法类型

  • Hello World 简化版Work Queues,一生产一消费
  • Work Queues 一生产多消费,多消费竞争
  • Publish/Subscribe 交换机绑定多队列
  • Routing 交换机加入路由键,将消息确定的发送到某队列
  • Topics 使用通配符匹配一个或多个路由键
  • Remote procedure call(RPC) 同步调用
  • Publisher Confirms 消息可靠性投递

Exchange 交换机

  • 交换机 —》 路由键 —》 队列
  • 交换机只负责转发消息,不具备存储消息的能力,若没任何队列与交换机绑定或没符合路由规则的队列,消息会丢失
  • 交换机接收消息,如何处理消息取决交换机类型
    • Work Queues 默认交换机发送到一个队列
    • Publish/Subscribe指定交换机使用的是Fanout类型交换机,采用广播形式,发送给与他绑定的多个队列
    • Routing指定交换机使用的是Direct类型交换机,采用定向形式,发送给符合指定routing key的队列
    • Topics指定交换机使用的是Topic类型交换机,采用通配符形式,发送给符合指定routing pattern(路由模式) 的队列

进阶篇

目录

  • 客户端整合SpringBoot
  • 消息可靠性投递
  • 消费端限流
  • 消息超时
  • 死信和死信队列
  • 延迟队列
  • 事务消息
  • 惰性队列
  • 优先级队列

客户端整合SpringBoot

  • 搭建环境

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  • 基础设定:交换机名称、队列名称、绑定关系

  • 发送消息:使用RabbitTemplate

    @Autowired
    private RabbitTemplate rabbitTemplate;@Test
    void send() {rabbitTemplate.convertAndSend("clw_sjzc_exchange", "clw_sjzc_routing_key", "hello world");
    }
    
  • 接收消息:使用@RabbitListener注解

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "test", durable = "true"),exchange = @Exchange(value = "test"),key = {"test"}))
    public void test(String msg, Message message, Channel channel) {System.out.println(msg);
    }@RabbitListener(queues = {"test"})
    public void test(String msg, Message message, Channel channel) {System.out.println(msg);
    }
    

消息可靠性投递

故障研判,对症下药

  • 消息没发送到消息队列

    • 生产者端进行确认,分别针对交换机和队列确认,若没成功发送到消息队列服务器上,可尝试重新发送

      spring:rabbitmq:host: 192.168.0.150port: 5672username: rootpassword: rootvirtual-host: /connection-timeout: 10000#交换机确认publisher-confirm-type: CORRELATED#队列确认publisher-returns: true
      
      @Configuration
      @Slf4j
      class RabbitConfig implements RabbitTemplate.ReturnCallback, RabbitTemplate.ConfirmCallback {@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 方法会在spring容器初始化的时候执行* 当容器实例化一个带有@PostConstruct注解的@Bean时,会在调用构造函数之后,在依赖注入完成之前执行这个方法* @PostConstruct 使用条件* 1. 方法不能有任何参数* 2. 不能是静态方法* 3. 不能返回任何值*/@PostConstructpublic void init() {rabbitTemplate.setConfirmCallback(this);rabbitTemplate.setReturnCallback(this);}@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {}@Overridepublic void returnedMessage(ReturnedMessage returned) {}
      }
      
    • 为目标交换机指定备份交换机,当目标交换机投递失败,把消息投递至备份交换机

  • 消息队列服务器宕机导致内存消息丢失

    • 消息持久化到硬盘,服务器重启也不会导致消息丢失
  • 消费端宕机或抛异常导致消息未成功消费

    • 消费端消费消息成功,给服务器返回ACK信息,然后消息队列删除该消息
    • 消费端消费消息失败,给服务器返回NACK信息,同时把消息恢复为待消费状态,可再次取回消息重试(消息端接口支持幂等性)
    spring:rabbitmq:host: 192.168.0.150port: 5672username: rootpassword: rootvirtual-host: /connection-timeout: 10000#交换机确认publisher-confirm-type: CORRELATED#队列确认publisher-returns: truelistener:simple:#消息确认自动变手动acknowledge-mode: manual 
    
    /*deliveryTag:交付标签机制消息进入队列为了做区分,broker会生成一个64位整数(long)唯一标识 deliveryTag消息往消费端投递时,携带交付标签消费端将消息处理结果 ACK、NACK、Reject 返回给Broker后,Broker对对应消息执行后续操作如 删除消息、重新排队、标记死信等,那Broker就必须直到现在操作的消息具体为哪一个若交换机是Fanout模式,同一消息广播到不同队列,deliveryTag也不会重复,deliveryTag是在Broker范围内唯一multiple:每个消息有自己的deliveryTag当 multiple 为 true,批量处理之前全部消息,当 multiple 为 false,单独处理当前消息		*/
    @RabbitListener(queues = "test")
    public void test(String msg, Message message,  Channel channel) {Boolean redelivered = message.getMessageProperties().getRedelivered();long deliveryTag = message.getMessageProperties().getDeliveryTag();try {channel.basicAck(deliveryTag, false);} catch (Exception e) {if (redelivered){System.out.println("重复消费,不再尝试");channel.basicNack(deliveryTag, false, false);}else {System.out.println("消费失败,再试一次");channel.basicNack(deliveryTag, false, true);}}
    }
    

消费端限流

削峰填谷

spring:rabbitmq:host: 192.168.0.150port: 5672username: rootpassword: rootvirtual-host: /connection-timeout: 10000#交换机确认publisher-confirm-type: CORRELATED#队列确认publisher-returns: truelistener:simple:#消息确认自动变手动acknowledge-mode: manual #每次从队列中取值数prefetch: 100 

消息超时

给消息设定一个过期时间,超过这个时间没有被取走的消息就会被删除

以下分为两个层面,若都设置则哪个时间短哪个生效

  • 队列层面:在队列层面设定消息的过期时间,并不是队列的过期时间,这个队列中的消息全部使用同一个过期时间
  • 消息本身:给具体的某个消息设定过期时间

死信和死信队列

当一个消息无法被消费,就变成死信

  • 产生原因
    • 拒绝:消费者拒接消息,basicNack()/basicReject(),并且不把消息重新放入原目标队列,requeue = false
    • 溢出:队列中消息数量达到限制,根据先进先出原则,将最早消息变成死信
    • 超时:消息到达超时时间未被消费
  • 处理方式
    • 丢弃:对不重要的消息直接丢弃,不做处理
    • 入库:把死信写入数据库,日后处理
    • 监听:消息变成死信进入死信队列,设置专用消费端监听死信队列,做后续处理(常用)

延迟队列

  • 借助消息超时时间+死信队列
  • 给RabbitMQ安装插件,最多延迟两天

事务消息

事务只针对生产者端,有局限性,控制缓存中的事务

惰性队列

未设置惰性模式时队列是持久化机制,创建队列时,在Durability 有两个选项可以选择

  • Durable:持久化队列,消息存储在硬盘上
    • 持久化时机:当Durable队列满时或者 broker关闭时,此时再往消息队列存入消息会暂时阻塞
  • Transient:临时队列,不做持久化操作,broker重启后消息会消失

优先级队列

基于队列先进先出的特性,通常先入队列的消息先投递,设置优先级之后,优先级高的消息更大几率先投递。关键参数:x-max-priority

RabbitMQ 允许使用一个正整数给消息设定优先级,取值范围1~255,官方建议1 ~5之间设置优先级,优先级越高占用CPU、内存等资源越多

x-max-priority指定最大优先级,默认为0。设置优先级参数不能大于这个值

集群篇

工作机制

  • 基本诉求
    • 避免单点故障、大流量场景分摊负载、数据同步
  • 工作机制
    • 先启动一个节点,然后让后续节点加入前面启动的节点,节点直接互相发现

集群搭建

负载均衡

仲裁队列

集群中有多个节点,仲裁队列Quorum Queue将自动分散在各个节点

流式队列

在一个仅追加的日志文件中保存接收到的消息,每个消息分配一个偏移量Offset,消息被消费端消费之后仍不删除,可以重复消费

指定偏移量消费,如同Kafka的指针一样,随着消息一直被消费,指针一直往后走

异地容灾

完整笔记总结

完整笔记总结

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

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

相关文章

【游戏制作】使用Python创建一个美观的贪吃蛇游戏,附完整代码

目录 前言 项目运行结果 项目简介 环境配置 代码实现 主体结构 主要功能详解 界面和菜单 控制蛇的移动 食物生成和碰撞检测 游戏结束 运行游戏 总结 前言 贪吃蛇游戏是一款经典的电脑游戏&#xff0c;许多人都曾经玩过。今天我们将使用Python和ttkbootstrap库来实…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

51单片机-第四节-定时器

一、定时器&#xff1a; 1.介绍&#xff1a; 单片机内部实现的计时系统。 作用&#xff1a;代替长时间Daley&#xff0c;提高cpu效率。 数量&#xff1a;至少2个&#xff0c;T0&#xff0c;T1&#xff0c;T2等。其中T0&#xff0c;T1为所有51单片机共有&#xff0c;T2等为不…

爬虫提速!用Python实现多线程下载器!

✨ 内容&#xff1a; 在网络应用中&#xff0c;下载速度往往是用户体验的关键。多线程下载可以显著提升下载速度&#xff0c;通过将一个文件分成多个部分并行下载&#xff0c;可以更高效地利用带宽资源。今天&#xff0c;我们将通过一个实际案例&#xff0c;学习如何用Python实…

typecho仿某度响应式主题Xaink

新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用。 演示图&#xff1a; 下载链接&#xff1a; t…

maven命令上传代码到sonar,上传jar包到私服

maven命令提交代码到soanrqube mvn package org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar -Dsonar.host.urlhttp://127.0.0.1:9090/ -Dsonar.token789789999999999 -Dsonar.projectKeyprojectKey-test -Dsonar.projectNameprojectName-test 参数含义&am…

【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐

一、简介 一个基于8051微控制器的计数器系统&#xff0c;该系统能够通过按键输入递增计数&#xff0c;并且能够在达到100时归零。该系统将使用计数器中断和外部中断来实现其功能。 51单片机因其简单易用和成本效益高&#xff0c;成为电子爱好者和学生的首选平台。通过编程单片…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

构造+有序集合,CF 1023D - Array Restoration

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1023D - Array Restoration 二、解题报告 1、思路分析 先考虑合法性检查&#xff1a; 对于数字x&#xff0c;其最左位置和最右位置 之间如果存在数字比x小&#xff0c;则非法 由于q次操作&#xff0c;第q…

GPT-4o mini:AI技术的平民化革命

目录 引言一、GPT-4o mini简介二、性能表现三、技术特点四、价格与市场定位五、应用场景六、安全性与可靠性七、未来展望八、代码示例结语 引言 在人工智能的浪潮中&#xff0c;大模型技术一直是研究和应用的热点。然而&#xff0c;高昂的成本和复杂的部署常常让许多企业和开发…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

学生党蓝牙耳机什么牌子的比较好?四大高性价比蓝牙耳机推荐

作为学生党&#xff0c;如果在有限的预算内选到一款合适自己的蓝牙耳机&#xff0c;那我们的生活和学习会增加很多的乐趣和便利&#xff0c;那面对市面上百元到千元不等的蓝牙耳机&#xff0c;学生党蓝牙耳机什么牌子的比较好&#xff1f;身为一名蓝牙耳机重度依赖者&#xff0…

AES算法分析:加密解密

✨主题简介 &#x1f510; 随着信息安全的重要性日益凸显&#xff0c;数据加密成为保护隐私和敏感信息的关键手段。本期我们将带你用Python实现AES加密解密&#xff0c;掌握这一强大的数据保护技术&#xff01; &#x1f4da;内容介绍 &#x1f50d; AES&#xff08;Advanced…

结构型设计模式-组合模式

一、组合模式 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

Discourse 备份和恢复中有关附件的问题

下面的这个问题是在官方论坛上网友问的内容是&#xff1a; 我想问一下&#xff0c;备份和附件分别挂载了不同的S3 备份的时候会把附件的S3里面的内容也都一起备份了吗&#xff1f;如果不选择包含上传的图片和附件&#xff0c;那么恢复备份的时候&#xff0c;附件用的S3里面的内…

【区块链+绿色低碳】雄韬智慧锂电储能管理系统 | FISCO BCOS应用案例

雄韬智慧锂电储能管理系统&#xff08;Energy Management System&#xff0c;以下简称 EMS&#xff09;是雄韬集团响应国家实现新型电力 系统建设&#xff0c;助力“碳达峰、碳中和”目标而自主开发的创新智慧锂电储能系统。 系统采用了 FISCO BCOS 联盟链&#xff0c;融合了物…

昇思25天学习打卡营第9天 |昇思MindSpore 基于MindNLP+MusicGen生成自己的个性化音乐

一、MusicGen 模型原理 MusicGen 是由 Meta AI 的 Jade Copet 等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型。它能够依据文本描述或音频提示生成高质量的音乐样本&#xff0c;相关研究成果可参考论文《Simple and Controllable Music Generation》。 …

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

【C++题解】1782. 字符图形2-星号倒直角

问题&#xff1a;1782. 字符图形2-星号倒直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3…