RabbitMQ的高级特性-消息确认机制

news/2024/9/27 22:12:11 标签: rabbitmq, 分布式

对于RabbitMQ发送消息到消费端的可靠性保障

引入:发送者发送消息后,到达消费端之后会出现一下两种情况:

①消息处理成功

②消息处理异常

RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第两种情况, 就会造成消息丢失,要保证消费端能够成功接收到消息,于是RabbitMQ就引入了消息确认机制

在RabbitMQ中:

消费者在订阅队列时,可以指定 autoAck 参数, 根据这个参数设置, 消息确认机制分为以下两种:
① ⾃动确认: 当autoAck 等于true时, RabbitMQ 会⾃动把发送出去的消息置为确认, 然后从内存(或
者磁盘)中删除, ⽽不管消费者是否真正地消费到了这些消息. ⾃动确认模式适合对于消息可靠性要求不⾼的场景.
② ⼿动确认: 当autoAck等于false时,RabbitMQ会等待消费者显式地调⽤Basic.Ack命令, 回复确认信号后才从内存(或者磁盘) 中移去消息. 这种模式适合对消息可靠性要求⽐较⾼的场景.

注:

当autoAck参数置为false, 对于RabbitMQ服务端⽽⾔, 队列中的消息分成了两个部分:
⼀是等待投递给消费者的消息.
⼆是已经投递给消费者, 但是还没有收到消费者确认信号的消息.
如果RabbitMQ⼀直没有收到消费者的确认信号, 并且消费此消息的消费者已经断开连接, 则RabbitMQ会安排该消息重新进⼊队列,等待投递给下⼀个消费者,当然也有可能还是原来的那个消费者

手动确认的方法:
消费者在收到消息之后, 可以选择确认, 也可以选择直接拒绝或者跳过, RabbitMQ也提供了不同的确认应答的⽅式, 消费者客⼾端可以调⽤与其对应的channel的相关⽅法:

1. 肯定确认: Channel.basicAck(long deliveryTag, boolean multiple)  :RabbitMQ 已知道该消息并且成功的处理消息. 可以将其丢弃了.
参数说明:
1) deliveryTag: 消息的唯⼀标识,它是⼀个单调递增的64 位的⻓整型值. deliveryTag 是每个通道
(Channel)独⽴维护的, 所以在每个通道上都是唯⼀的. 当消费者确认(ack)⼀条消息时, 必须使⽤对应的通道上进⾏确认.
2) multiple: 是否批量确认. 在某些情况下, 为了减少⽹络流量, 可以对⼀系列连续的 deliveryTag 进
⾏批量确认. 值为 true 则会⼀次性 ack所有⼩于或等于指定 deliveryTag 的消息. 值为false, 则只确认当前指定deliveryTag 的消息.

2. 否定确认: Channel.basicReject(long deliveryTag, boolean requeue):RabbitMQ在2.0.0版本开始引⼊了 Basic.Reject 这个命令, 消费者客⼾端可以调⽤channel.basicReject⽅法来告诉RabbitMQ拒绝这个消息.
参数说明:
 requeue: 表⽰拒绝后, 这条消息如何处理. 如果requeue 参数设置为true, 则RabbitMQ会重新将这条消息存⼊队列,以便可以发送给下⼀个订阅的消费者. 如果requeue参数设置为false, 则RabbitMQ会把消息从队列中移除, ⽽不会把它发送给新的消费者.

3. 否定确认: Channel.basicNack(long deliveryTag, boolean multiple,boolean requeue)Basic.Reject命令⼀次只能拒绝⼀条消息,如果想要批量拒绝消息,则可以使⽤Basic.Nack这个命令. 消费者客⼾端可以调⽤ channel.basicNack⽅法来实现.

multiple参数设置为true则表⽰拒绝deliveryTag编号之前所有未被当前消费者确认的消息.

SpringBoot中的确认机制:

1. AcknowledgeMode.NONE
      这种模式下, 消息⼀旦投递给消费者, 不管消费者是否成功处理了消息, RabbitMQ 就会⾃动确认
消息, 从RabbitMQ队列中移除消息. 如果消费者处理消息失败, 消息可能会丢失.(消费者正常/异常处理:MQ删除相应的消息)
2. AcknowledgeMode.AUTO(默认)
      这种模式下, 消费者在消息处理成功时会⾃动确认消息, 但如果处理过程中抛出了异常, 则不会确认消息.(消费者正确处理:消息自动确认,消费者异常处理:消费会不停重试)
3. AcknowledgeMode.MANUAL
      ⼿动确认模式下, 消费者必须在成功处理消息后显式调⽤ basicAck ⽅法来确认消息. 如果消
息未被确认, RabbitMQ 会认为消息尚未被成功处理, 并且会在消费者可⽤时重新投递该消息, 这
种模式提⾼了消息处理的可靠性, 因为即使消费者处理消息后失败, 消息也不会丢失, ⽽是可以被
重新处理.

配置代码:

spring:
  rabbitmq:
    addresses: 
    listener:
      simple:
        acknowledge-mode: none/auto/manual


http://www.niftyadmin.cn/n/5679672.html

相关文章

LLM Agent系列 | 端侧Agent路由器,合纵连横AI江湖,破局端侧大模型之困!

引言 简介 背景 相关工作 Octopus v4 Octopus v2 图中节点 基于图的任务规划 功能token和数据集收集 图系统设计 评测 专业模型 MMLU基准评估 实战 英文 中文示例1 中文示例2 总结 引言 若待上林花似锦,出门俱是看花人。 小伙伴们好,我是…

付费计量系统标准化未来展望

Items relating to the standardization of payment metering systems that might need to be addressed in the future are: 与付费计量系统标准化相关的,在将来需要增加的项目有: a) as each industry specification is proposed to the IEC f…

vue-cli,element-plus,axios,proxy

一、vue-cli vue-cli俗称vue脚手架,是vue官方提供的快速生成vue 工程化项目的工具。 1.官网:https://cn.vuejs.org/ 中文官网: https://cli.vuejs.org/zh/ 特点:基于webpack,功能丰富且易于扩展,支持创建vue2和vu…

Translation Consistent Semi-supervised Segmentation for 3D Medical Images 阅读

code: yyliu01/TraCoCo: [TMI24] Translation Consistent Semi-supervised Segmentation for 3D Medical Images (github.com) paper:Translation Consistent Semi-supervised Segmentation for 3D Medical Images (arxiv.org) Abstract 三维医学图像分割方法已经取得了成功…

端口复用实战:原理、功能与案例详解

1. 引言 在网络通信中,端口是一个重要的概念。它允许多个网络服务在同一台计算机上共存。然而,传统上每个端口只能被一个服务占用。端口复用技术打破了这个限制,允许多个服务共享同一个端口,从而提高了资源利用率和系统灵活性。本文将深入探讨端口复用的原理、功能,并通过…

Golang | Leetcode Golang题解之第433题最小基因变化

题目: 题解: func diffOne(s, t string) (diff bool) {for i : range s {if s[i] ! t[i] {if diff {return false}diff true}}return }func minMutation(start, end string, bank []string) int {if start end {return 0}m : len(bank)adj : make([][…

IMDB影评情感分析项目

imdb数据集下载地址: http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz import os import torch from torch import nn import dltools def read_imdb(data_dir, is_train):data, labels = [], []for label in (pos, neg):folder_name = os.path.join(data_di…

日期类的实现- 计算日期之间相差多少天-解决单参数构造

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 这里有坑,这里有坑,这里有坑 首选我们直接上代码,因…