首页 > 其他分享 >速通RabbitMQ

速通RabbitMQ

时间:2024-10-03 22:23:54浏览次数:7  
标签:速通 exchange 队列 RabbitMQ queue 死信 消息 节点

 

MQ三大重要特性:解耦,异步,削峰

RABBITMQ:

1.rabbitMQ有什么使用场景:

  • 异步发送消息(邮件,验证码,短信)
  • MYSQL,REDIS,ELASTICSEARCH之间的数据同步
  • 分布式事务保持高可用性
  • 削峰填谷

 

2.rabbitMQ如何保证消息不丢失?

在正常情况下publisher发送消息至exchange,exchange选择queue,再由queue将消息发送给consumer完成一次消息

  • publisher->exchange
    • 生产者确认机制:rabbitMQ提供了一个publisher confirm机制,当mq收到消息后,会给发送者提供一个回值表示消息处理成功
    • 如果失败了,这里MQ会返回给publisher一个publisher-confirm NACK(NACK其实就是未路由的意思,没有找到路由)
  • exchange->queue
    • 如果失败了,这里MQ会返回给publisher一个publisher-return ACK(这里也是一种特殊的NACK,没有匹配到相应的queue,导致发送失败)
    • 上述两种生产者发送消息失败,使用以下几种兜底方案:(失败一般就是两种情况:代码的问题,这个只能人工干预再修改;机器的问题,机器宕机了,可能是生产者也可能是MQ,这个就需要后续重新发送即可)
      • 回调失败后立即重发
      • 记录日志,后续补偿
      • 保存消息至MySQL,然后定时重发,发送成功后删除表内的数据
    • 持久化机制:确保在MQ内的消息不会丢失:可以在java中通过代码持久化exchange,queue和message。当然在springAMQP中message的持久化是默认的
  • queue->consumer
    • 消费者确认机制:消费者处理完消息后会给MQ一个回值ACK,MQ收到ACK后可以删除message
    • springAMQP提供三种确认机制:
      • manual:需要用户调用API返回ack
      • auto(首选):spring监听listen是否有问题,自动返回ack
      • none:mq会假定消息发送成功,消息投递后会立刻删除
    • spring提供retry机制,消费者出现异常时调用本地重试机制,重试机制到达最大值后如果消息依旧发不出去,就会将消息放入errorExchange,转人工处理

 

3.rabbitMQ如何解决消息重复消费问题(幂等问题)

mq在网络抖动,消费者挂了的时候会出现重复消费

解决方案:

为消息设计一个唯一标识id(一般这个id是数据库里的一个unique);幂等方案:分布式锁,乐观锁,悲观锁

 

4.rabbitMQ中死信交换机(延迟队列)

延迟队列使用场景:超时订单、限时优惠、定时发布

延迟队列=死信交换机+TTL(生存时间)

死信条件:

  1. 消费者消费失败并且设置消息会成为死信
  2. 消息超过过期时间,仍然未消费(基于此可以实现延迟队列,消息本身、消息所在队列都可以设置一个存活时间TTL。两者取最小值。除此以外还可以使用delayExchange插件实现延迟队列)
  3. 投递的队列消息满了,最早的消息就可能会成为死信

死信交换机:需要在构造队列的时候声明队列的死信进入指定的dead letter exchange,并且该exchange也需要绑定对应的queue存储死信

使用DelayExchange插件后,不需要额外声明内容,只需要指定其为死信交换机,并设置x-delay即可

 

5.如何解决MQ大量消息堆积问题

什么是消息堆积问题:当生产者产生消息的速度超过了消费者,就会导致队列内的消息堆积,队列存储达到上限后。之后的消息可能会被丢弃,可能会成为死信

解决方案:

增加消费者,提高消费速度

消费者内开启线程池加快处理,

扩大队列容量,添加惰性队列(惰性队列就是消息不再存储至内存,转为磁盘可极大提高队列容量)

 

6.rabbitMQ的高可用机制

普通集群:

镜像集群:本质是主从模式。

  • exchange,queue,message会在mq的各个镜像节点之间同步备份。
  • 创建队列的节点被称为该队列的主节点,备份主节点叫该队列的镜像节点。
  • 所有操作都是主节点先完成,再同步给镜像节点;主节点宕机会选用镜像节点作为新的主节点。
  • 缺点是如果在同步的时候如果主节点宕机了,那么就可能会造成丢失数据。

仲裁队列:优化版的镜像集群,采用raft协议保证主从强一致性改善了镜像集群的缺点,而且配置简单:只需要在声明队列时加上.quorum()方法即可。

 

标签:速通,exchange,队列,RabbitMQ,queue,死信,消息,节点
From: https://www.cnblogs.com/kun1790051360/p/18414444

相关文章

  • RabbitMQ死信队列和延迟队列(具体代码演示)
    先理解以下两点:1.延迟队列存储是延时消息,指当消息被发送以后,不让消费者立即拿到消息,而是等待指定时间后,消费者才能拿到消息进行消费。(队列设置过期时间对队列中所有消息生效,如果队列和消息都设置了消息过期时间,会取时间短的)2.入死信队列的三种情况:1.请求被拒绝的消息2.......
  • rabbitmq部署 从单节点到集群,到镜像
    想搭建镜像,也需要从单节点一步步往下,按顺序执行,应该不会有什么问题准备工作:1、设置主机名(根据自己主机的情况设置,主机名不能有.)hostnamectlset-hostnamenode01###节点01hostnamectlset-hostnamenode02###节点02hostnamectl--prettyhostnamectl-......
  • 面试速通宝典——3
    51.野指针和内存泄漏是什么?如何避免?‌‌‌‌内存泄漏:是指程序中以动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。‌‌‌‌避免:使用智能指针管理资源,在释放对象数组时使用delete,尽量避免在堆......
  • python 操作RabbitMq详解
    一、简介:RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件。消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取完成通信。而作为中间件的RabbitMq无疑是目前最流行的消息队列之一。    RabbitMq......
  • RabbitMQ中交换机(Exchange)的类型有哪些及其特点是什么?
    RabbitMQ中的交换机(Exchange)是消息路由的核心组件,它决定了消息如何从生产者路由到队列。RabbitMQ支持多种类型的交换机,每种类型都有其特定的路由逻辑。以下是几种主要的交换机类型及其特点:直接交换机(DirectExchange)特点:直接交换机会将消息发送到绑定键(bindingkey)......
  • 三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关
    文章目录IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点进程线程创建线程的三种方式网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码XMLXML的作用是什么?xml特点注解什么是注解?注解的使用注解的重要性注解的使用实例M......
  • 数据结构:速通并查集
    并查集用来干什么:处理不相交的集合的合并以及查询相交集合的个数等情况例题(自行搜索):36024年第一批笔试算法题传染病防控 并查集具有三个操作initfindunioninit初始化集合,将当前所有节点的父节点设置为自己intfa[]=newint[10000];intsize[]=newint[10000];//这里是......
  • 算法速通-90题(1—完数难题)[含pyhton,java,c++]
    题目:完数难题 题目描述如下:    小明正在进行期末数学考试,现在他遇到了这样一个题:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数   比如6,28都是完数:6=1+2+3 ; 28=1+2+4+7+14。请判断两个正整数之间完数的个数。小明想请聪明的你帮......
  • RabbitMQ五种工作模式的代码具体实现(代码简单易懂)(一)
    一、简单队列模式:直接把消息发送给队列,且队列只有一个消费者。使用的是Rabbitmq默认的交换机。生产者部分:<!--amqp依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</art......
  • Spring Boot 集成 RabbitMQ 发送延时消息
    1.SpringBoot集成RabbitMQ发送延时消息1.1.版本说明1.2.Spring配置1.3.定义常量1.4.配置交换机和队列1.5.测试1.SpringBoot集成RabbitMQ发送延时消息延时消息依赖于rabbitmq-delayed-message-exchangeRabbitMQ插件实现,Github地址,启用该插件后可......