RabbitMQ如何保证消息不丢失?

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

1、什么情况会导致消息丢失​​​​​​

         a.发送时丢失:

                   生产者发送的消息未送达exchange

                   消息到达exchange后未到达queue

        b.MQ宕机,queue将消息丢失

        c.consumer接收到消息后未消费就宕机

2、如何保证息不丢失,就是分别避免每一个环节丢失

        a.保证生产者不丢消息

        b.保证rabbitmq不丢消息

        c.保证消费端不丢消息

3、RabbitMQ生产者如何避免消息丢失?

        a.保证生产者不丢消息,要确保说写rabbitmq的消息别丢,可以开启。

        b.每次写的消息都会分配一个唯一的id,如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息,告诉你说这个消息ok了。

        c.如果rabbitmq没能处理这个消息,会回调你一个nack接口,告诉你这个消息接收失败,我们可以重试。

        (publisher-confirm,发送者确认消息成功投递到交换机,返回ack;消息未投递到交换机,返回nack。publisher-return,发送者回执,消息投递到交换机,但是没有路由到队列。返回ACK,及路由失败原因。)

        RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

4、如何实现消息持久化?(注意:SpringAMQP默认已经进行持久化

        a.保证rabbitmq不丢消息,开启rabbitmq的持久化(持久化queue和message、exhange),设置不能自动删除

        b.交换机持久化   :   RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

        c.持久化queue,在创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据。

RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

        d.持久化Message,在发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的,此时rabbitmq就会将消息持久化到磁盘上去。

RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

4、消费者有几种确认机制?

        RabbitMQ支持消费者确认机制:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息。SpringAMQP允许配置三种确认模式:

                none:关闭ackMQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除。

                manual:手动ack,需要在业务代码结束后,调用api发送ack

                auto:自动ack,由spring监测listener代码是否出现异常,没有异常返回ack;有异常返回nack(默认)。(注意:auto默认方式,消费者消息处理异常后消息会重新入队,如果消费者一直异常则会一直死循环。

        方式是修改application.yml文件,添加下面配置:              RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

5、消费者消费失败后如何解决死循环导致MQ压力大?(注意:重试次数达到后,消息被丢弃。)

        当消费者出现异常后,消息会不断requeue(重新入队)到队列,再重新发送给消费者,然后再次异常,再次requeue,无限循环,导致mq的消息处理飙升,带来不必要的压力:

RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

        我们可以利用Springretry机制,在消费者出现异常时利用本地重试,而不是无限制的requeuemq队列。

RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

        开启Spring本地重试模式后,重试次数耗尽,如果消息依然失败,则需要有MessageRecoverer接口来处理,它包含三种不同的实现:

        a.RejectAndDontRequeueRecoverer:重试耗尽后,直接reject,丢弃消息。默认就是这种方式。

        b.ImmediateRequeueMessageRecoverer:重试耗尽后,返回nack,消息重新入队。

        c.RepublishMessageRecoverer:重试耗尽后,将失败消息投递到指定的交换机(推荐使用)。       RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

        测试下RepublishMessageRecoverer处理模式:

        创建配置类ErrorMessageConfig,定义接收失败消息的交换机、队列及其绑定关系:        RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务        然后,定义RepublishMessageRecoverer:        RabbitMQ如何保证消息不丢失?,rabbitmq,分布式,微服务

6、如何确保RabbitMQ消息的可靠性(面试)?        

        1.开启生产者确认机制,确保生产者的消息能到达队列

        2.开启持久化功能,确保消息未消费前在队列中不会丢失

        3.开启消费者确认机制为auto,由spring确认消息处理成功后完成ack

        4.开启消费者失败重试机制,配置重试次数、重试时间

        5.改变默认失败重试策略,多次重试失败后将消息投递到异常交换机,交由人工处理文章来源地址https://www.toymoban.com/news/detail-784769.html

到了这里,关于RabbitMQ如何保证消息不丢失?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RabbitMQ 保证消息不丢失的几种手段

    在使用消息队列时,面对复杂的网络状况,我们必须要考虑如何确保消息能够正常消费。在分析如何保证消息不丢失的问题之前,我们需要对症下药,什么样的情况会导致消息丢失。 在弄清消息丢失的情况之前,我们先看看一条消息从产生到最终消费会经历哪些过程。 上面

    2024年02月08日
    浏览(41)
  • 消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

    目前主流的消息队列技术(MQ技术)分为RabbitMQ和Kafka,其中深蓝色为只要是MQ,一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ主要提供的功能为:异步 解耦 削峰 。 展开来讲就是 异步发送(验证码、短信、邮件…) MYSQL和Redi

    2024年01月24日
    浏览(57)
  • rabbitMQ如何保证数据不丢失

    Q: 当订单服务发送一条消息到rabbitMQ, rabbitMQ成功接收到了消息并保存在内存中, 但是在仓储服务没有拿走此消息之前, rabbitMQ宕机了. 怎么办? A:此问题需要考虑消息持久化(durable机制), 通过设置队列的durable参数为true, 则当rabbitMQ重启之后, 会恢复之前的队列. 它的工作原理是rab

    2024年02月15日
    浏览(39)
  • RabbitMQ消息丢失、消息重复消费、消息顺序性无法保证、消息积压、一致性问题、系统可用性降低等这些常见问题怎么解决

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 1. 消息丢失 问题 :在生产者发送消息到MQ、MQ内部处理、消费者接收消息的任一环节都可能导致消息丢失。 解决方案 : 生产者确认机制 :确保消息

    2024年04月25日
    浏览(34)
  • 分布式消息队列:RabbitMQ(1)

    目录 一:中间件 二:分布式消息队列  2.1:是消息队列 2.1.1:消息队列的优势 2.1.1.1:异步处理化 2.1.1.2:削峰填谷 2.2:分布式消息队列 2.2.1:分布式消息队列的优势 2.2.1.1:数据的持久化 2.2.1.2:可扩展性 2.2.1.3:应用解耦 2.2.1.4:发送订阅  2.2.2:分布式消息队列的应用场景  三:Rabbitmq 3.1:基

    2024年02月08日
    浏览(64)
  • 分布式消息队列:Rabbitmq(2)

    目录 一:交换机 1:Direct交换机 1.1生产者端代码:  1.2:消费者端代码: 2:Topic主题交换机  2.1:生产者代码:  2.2:消费者代码:  二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间  2.2:死信队列 绑定: 让交换机和队列进行关联,可以指

    2024年02月08日
    浏览(43)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(64)
  • 【RabbitMQ】RabbitMQ如何确认消息被消费、以及保证消息的幂等

    目录 一、如何保证消息被消费 二、如何保证消息幂等性 RabbitMQ提供了消息补偿机制来保证消息被消费,当一条消费被发送后,到达队列后发给消费者。消费者消费成功后会给MQ服务器的队列发送一个确认消息,此时会有一个回调检测服务监听该接收确认消息的队列,然将消费

    2024年02月16日
    浏览(38)
  • RabbitMQ如何保证消息可靠性

    目录 1、RabbitMQ消息丢失的可能性 1.1 生产者消息丢失场景 1.2 MQ导致消息丢失 1.3 消费者丢失 2、如何保证生产者消息的可靠性 2.1 生产者重试机制 2.2 生产者确认机制 2.3 实现生产者确认 2.3.1 配置yml开启生产者确认 2.3.2 定义ReturnCallback 2.3.3 定义ConfirmCallback 3、MQ消息可靠性 3.1

    2024年02月20日
    浏览(51)
  • 如何保证RabbitMQ消息的顺序性

    针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;比如:在写入消息队列的数据做唯一标示,消费消 息时,根据唯一标识判断是否消费过;假设你有个系统,消费一条消息就往数据库里插入一条数据,

    2024年02月07日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包