当前位置: 首页 > article >正文

RabbitMQ MQ的可靠性及消费者的可靠性

1.MQ可靠性:

如何保证消息的可靠性:

        (1).通过配置可以让交换机、队列、以及发送的消息都持久化。这样队列中的消息会持久化到磁盘,MQ重起消息依然存在。

        (2).3.6.0版本开始,RabbitMQ引入了惰性队列模式,这种模式下,消息会直接存储到磁盘而不是内存中,这样可以减少内存消耗,尤其适用于消息量特别大的场景。在3.12版本之后,惰性队列已经成为RabbitMQ的默认队列类型。

        (3).开启持久化和生产者确认时,RabbitMQ只有在消息持久化完成后才会给生产者返回ACK回执。

消息持久化

        消息持久化是确保 RabbitMQ 中的消息在服务器重启或崩溃后不会丢失的重要机制。通过持久化消息,可以将消息存储在磁盘上,而不仅仅是内存中。这样,即使 RabbitMQ 服务器发生故障,消息也不会丢失,因为它们可以从磁盘上恢复。  

持久化队列:在创建队列时,可以指定队列为持久化的。这意味着队列的元数据和其中的消息都会在 RabbitMQ 服务器重启后恢复。

持久化消息:当发送消息时,可以通过设置消息的 deliveryMode 属性为 2(表示消息是持久化的)来确保消息被持久化到磁盘。

确保交换器持久化(可选):虽然交换器的持久化不是必需的,但建议也将其设置为持久化,以确保交换器的配置在服务器重启后能够恢复。

2.消费者可靠性

消费者如何保证消费者一定被消费:

        (1). 开启消息确认机制为auto,由spring确认消息处理成功后返回ack,异常时返回nack

        (2).开启消费者失败重试机制,并设置MessageRecover,多次重试失败后将消息投递到异常交换机,交由人工处理。

消费者确认机制

        消费者确认是一种确保消息被正确处理的协议。当 RabbitMQ 将消息传递给消费者后,消费者需要通过发送一个确认回 RabbitMQ 来告知它已经成功接收并处理了这个消息。这样,RabbitMQ 才会从队列中移除该消息。这个机制对于确保数据的可靠性至关重要。RabbitMQ提供了两种消费者确认模式:

        (1).自动确认(Auto Acknowledge)

  • 模式描述:消息一旦被消费者接收,RabbitMQ立即认为该消息已被成功处理,并将其从队列中删除,无需等待消费者明确确认。
  • 优点:吞吐量高,因为省去了显式确认的过程。
  • 缺点:如果消费者在处理消息过程中崩溃,消息会丢失,因为RabbitMQ在消息到达消费者时就已经将其标记为已处理。

        (2).手动确认(Manual Acknowledge)

  • 模式描述:消费者在处理完消息后,需要显式地向RabbitMQ发送确认(ACK)信号,表明该消息已经被成功处理。只有当收到这个确认后,RabbitMQ才会将消息从队列中删除。
  • 优点:确保消息不会因消费者故障而丢失。如果消费者处理消息失败,RabbitMQ可以将该消息重新投递给其他消费者(或同一消费者)。
  • 缺点:稍微增加了系统的复杂性和延迟,因为需要等待消费者的明确确认。

消费者失败重试机制

        消费者失败重试机制是一种确保消息在处理失败时能够被重新处理的策略。消费者在处理消息时,如果发生异常,可以在本地进行重试。重试的次数和间隔可以通过配置来设定。例如,在Spring AMQP中,可以通过application.yml文件配置重试机制,如下所示:

如何保证业务幂等性

     为每条消息生成唯一的ID,并在消费时检查是否已处理过。在数据库层面使用唯一约束,防止重复插入。


http://www.kler.cn/a/326992.html

相关文章:

  • 多线程--简单模拟实现线程池并使用--Java
  • 智能语音机器人智能在哪里?AI人工智能电话机器人部署
  • Redis 初学者指南
  • 《AI产品经理手册》——解锁AI时代的商业密钥
  • 优选算法精品——双指针
  • 像`npm i`作为`npm install`的简写一样,使用`pdm i`作为`pdm install`的简写
  • 【Ubuntu】VMware中虚拟网卡与服务器网卡的绑定
  • XHTML学习
  • MacOS升级Ruby版本详解:步骤、挑战与解决方案
  • 【Linux:线程概念】
  • 【并发】ThreadLocal 为什么会内存泄露
  • golang小项目1-家庭收支记账系统
  • java计算机毕设课设—超级玛丽游戏(附源码、文章、相关截图、部署视频)
  • OJ在线评测系统 后端基础部分开发 完善CRUD相关接口
  • 【ARM 嵌入式 C 入门及渐进26 -- 内敛函数和宏定义的区别】
  • armbian安装docker
  • MongoDB的查询/超详细/表达式符号
  • SQLMap使用指南
  • Linux服务安装node,npm与yarn
  • 0-1开发自己的obsidian plugin DAY 6
  • 数据挖掘的基本步骤和流程解析:深入洞察与策略实施
  • 重修设计模式-行为型-责任链模式
  • ubuntu24.04 最好的输入法是什么?
  • 【ARM 嵌入式 编译系列 10.6 -- ARM toolchain examples】
  • 【Docker】解决Docker Engine stopped
  • cocos打包后发布web,控制台报错.plist资源下载404