RabbitMQ常见问题及解决方案

这篇具有很好参考价值的文章主要介绍了RabbitMQ常见问题及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、消息丢失

1、生产者重连

2、生产者确认

3、数据持久化

4、惰性队列

5、消费失败处理

二、消息重复

1、通过业务保证幂等性(优先)

2、通过消息状态去重保证幂等性

三、消息堆积

1、优化消费者处理逻辑

2、增加队列及消费者数量

3、使用惰性队列

四、保证消息顺序消费


一、消息丢失

1、生产者重连

由于网络波动,可能会出现客户端连接失败的情况,需开启重连机制。

SpringBoot项目配置:

spring:
  rabbitmq:
    # 连接超时时间
    connection-timeout: 500ms
    template:
      retry:
        # 开启失败重连
        enabled: true
        # 失败后重连初始间隔时间
        initial-interval: 1000ms
        # 失败后下次间隔的时长倍数,下次间隔时长=本次间隔时长*multiplier
        multiplier: 1
        # 最大重试次数
        max-attempts: 3

注意:重试过程线程是被阻塞的,合理配置等待时长及最大重试次数,或开启异步线程执行,以免影响业务性能。

2、生产者确认

SpringBoot项目配置:

spring:
  rabbitmq:
    # 开启生产者确认
    publisher-confirm-type: correlated
    # 返回路由失败消息,一般是开发问题,无需开启
    publisher-returns: true

 publisher-confirm-type三种模式:

none 关闭
simple 同步阻塞等待MQ回执消息
correlated(推荐) MQ异步回调返回回执消息

注意:以上两种方式均会造成MQ性能下降,非必要不建议开启。失败情况毕竟非常少,可在代码中通过输出日志或存储数据库等方式将发送失败的消息记录下来,稍后手动处理。

3、数据持久化

  • 交换机持久化:在声明交换器时将“durable”参数设置为true
  • 队列持久化:在声明队列的时将“durable”参数设置为true
  • 消息持久化:生产消息时设置属性delivery_mode=2

SpringBoot项目:

交换机和消息默认为持久化,需自行设置队列持久化。

@RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "xx.queue", durable = "true"),
            exchange = @Exchange(name = "xx.topic", type = ExchangeTypes.TOPIC),
            key = "xx"
    ))

4、惰性队列

RabbitMQ3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。惰性队列的特征如下:

  1. 接收到消息后直接存入磁盘而非内存
  2. 消费者要消费消息时才会从磁盘中读取并加载到内存
  3. 支持数百万条的消息存储

声明LazyQueue:

@RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "xx.queue", durable = "true",
                    arguments = {@Argument(name = "x-queue-mode", value = "lazy"),
            exchange = @Exchange(name = "xx.topic", type = ExchangeTypes.TOPIC),
            key = "xx"
    ))

优点: 

  1. 基于磁盘存储,消息上限高

  2. 没有间歇性的page-out,性能比较稳定

缺点:

  1. 基于磁盘存储,消息时效性会降低

  2. 性能受限于磁盘的IO

5、消费失败处理

失败后尝试在本地重试,重试后依然失败,将消息投递到用于投递失败消息的交换机,存储到失败消息队列中,等待后续手动处理。

SpringBoot项目配置:

spring:
  rabbitmq:
    listener:
      simple:
        retry:
          # 开启失败重试
          enabled: true

 SpringBoot项目配置类:

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.retry.MessageRecoverer;
import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMqErrorConfig {

    @Bean
    public DirectExchange errorExchange() {
        return new DirectExchange("error.direct");
    }

    @Bean
    public Queue errorQueue() {
        return new Queue("error.queue");
    }

    @Bean
    public Binding errorBinding(Queue errorQueue, DirectExchange errorExchange) {
        return BindingBuilder.bind(errorQueue).to(errorExchange).with("error");
    }

    @Bean
    public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate) {
        return new RepublishMessageRecoverer(rabbitTemplate, "error.direct", "error");
    }
}

二、消息重复

由于网络问题或消息生产消费过程中出现问题,均会导致消息重复的情况。

1、通过业务保证幂等性(优先)

在业务层面上,保证重复执行对结果不产生影响。例如:支付成功后修改订单状态,可以将未支付状态作为修改语句的执行条件。

2、通过消息状态去重保证幂等性

如果不能通过业务保证幂等性,可以将处理过的消息ID记录到redis,如果新到的消息ID已经在记录中,那么就不再处理这条消息。

三、消息堆积

1、优化消费者处理逻辑

优化消费者处理逻辑,使消费者更快处理。

2、增加队列及消费者数量

将队列绑定多个消费者,提高消费速度。

3、使用惰性队列

基于磁盘存储,消息上限高。

四、保证消息顺序消费

发生原因:

  1. 一个队列绑定多个消费者
  2. 一个消费者开启多个线程

1、将一个队列拆分成多个队列,保证一个队列只绑定一个消费者,生产者在投递消息时根据业务数据关键值来将需要保证先后顺序的同一类数据发送到同一个队列当中。

2、将队列设置为单活模式

x-single-active-consumer:单活模式,表⽰是否最多只允许⼀个消费者消费,如果有多个消费者同时绑定,则只会激活第⼀个,除⾮第⼀个消费者被取消或者死亡,才会⾃动转到下⼀个消费者。文章来源地址https://www.toymoban.com/news/detail-776925.html

@RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "xx.queue", durable = "true",
                    arguments = {@Argument(name = "x-single-active-consumer", value = "true", type = "java.lang.Boolean")}),
            exchange = @Exchange(name = "xx.topic", type = ExchangeTypes.TOPIC),
            key = "xx"
    ))

到了这里,关于RabbitMQ常见问题及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RocketMQ常见问题及解决方案

    RocketMQ FAQ 可能原因 1)消费端处理消息发生异常没有捕获或是因为其他原因,没有返回消费状态 解决方案: 消费端捕获异常, 如果需要重试,返回ConsumeConcurrentlyStatus. RECONSUME_LATER , 如果不需要重试,返回ConsumeConcurrentlyStatus. RECONSUME_SUCCESS 可以在消费端增加重试次数判断,

    2023年04月08日
    浏览(53)
  • 冷启问题目前常见解决方案

    随机冷启 个性化冷启 冷启动保量 冷启动保量,保证每个item曝光的次数一样,实时统计已曝光的次数和要曝光的次数 冷启动结束过滤,如果需曝光的量越大,且越接近冷启结束时间,得分越高,被曝光的概率越大 爬坡保量 实时统计曝光、点击、ctr;ctr越高,曝光越少,得分

    2024年02月11日
    浏览(50)
  • vlc option以及常见问题解决方案

    2024年02月08日
    浏览(268)
  • 常见后端数据存储问题解决方案

    1、mysql数据准确性        常见电商系统中,如订单服务、现金券服务、活动类服务等,这类服务中经常会出现一些并发更新数据的情况,如何保证数据准确性。虽然有些操作可通过\\\"状态\\\"字段做了类似乐观锁的处理。但理论上还是会出现ABA的问题,而且规则不够统一,不同

    2023年04月18日
    浏览(41)
  • HBase实际应用中常见的问题 解决方案

    HBase 是一个分布式的、面向列的开源数据库,通常用于处理大规模数据。在实际应用中,可能会遇到一些常见问题,以下是一些常见问题及其解决方案: 性能问题 : 问题 :HBase 性能下降,读写延迟增加。 解决方案 :可以通过增加 Region Server、优化 HDFS、调整 HBase 配置参数

    2024年01月19日
    浏览(43)
  • 微信小程序:小程序常见问题及解决方案

    在小程序中使用原生的表单组件时,在有弹出框出现的情况下,原生表单组件会出现在遮罩层上面,且会造成事件穿透的情况。 解决方案一: 使用cover-view,cover-view比原生组件的层级更高,或者说也是一种原生组件,不过在cover-view的子组件只能是coveri-view、cover-image,对于包

    2024年02月10日
    浏览(72)
  • BurpSuite【安装配置、使用细节、常见问题解决方案等】

    问题描述 使用某博客所述方法安装BurpSuite后,当天使用正常,但过几天后发现无法打开。 可能原因 JAVA安装路径下的文件夹名(父级文件夹)被修改过,但是系统环境变量中的路径值没有相应修改。 解决方案 检查系统环境变量中JAVA_HOME和Path的路径值(根据个人安装时的配置

    2024年02月11日
    浏览(46)
  • 在Mac上安装SQLsever,常见问题及解决方案

    前言: 最近入手了新的Mac M2 arm 框架的 苹果电脑,公司新项目采用SQLsever2019版本,在Mac上安装SQLsever千难万阻,查阅很多资料最后寻求的解决方案,记录如下,供大家参考。 说下大致的安装步骤和里面踩的坑, 通篇阅读后再动手 首先Mac想要安装SQLsever,通过docker去拉去镜像

    2024年02月10日
    浏览(44)
  • 【大数据安全-Kerberos】Kerberos常见问题及解决方案

    可以用来帮助诊断 Kerberos 相关问题的原因并实施解决方案的指南。 javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)] 此消息表明一个操作尝试要求以 Kerberos 的 user/host@realm 身份认证的操作,但票据 cac

    2024年02月05日
    浏览(54)
  • 运行 `npm install` 时的常见问题与解决方案

    描述: 运行 npm install 时,可能会遇到网络连接问题,导致无法正常下载依赖包。 报错示例: npm ERR! network connection timed out npm ERR! connect ETIMEDOUT npm ERR! getaddrinfo EAI_AGAIN 解决方案: 确保你的计算机已连接到互联网。可以尝试打开浏览器,访问其他网页来确认网络连接正常。 检

    2024年02月07日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包