国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot集成RabbitMQ之ACK確認(rèn)機(jī)制(第三節(jié))

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot集成RabbitMQ之ACK確認(rèn)機(jī)制(第三節(jié))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

開(kāi)始語(yǔ)

??簡(jiǎn)述

???模式NONE

application配置

生產(chǎn)者

消費(fèi)者

結(jié)果驗(yàn)證

???模式AUTO

application配置

生產(chǎn)者

消費(fèi)者

結(jié)果驗(yàn)證

???模式ACK(重點(diǎn))

application配置

生產(chǎn)者

消費(fèi)者

結(jié)果驗(yàn)證

???生產(chǎn)者確認(rèn)機(jī)制

yml添加配置

修改生產(chǎn)者代碼

結(jié)果驗(yàn)證

結(jié)束語(yǔ)


開(kāi)始語(yǔ)

一位普通的程序員,慢慢在努力變強(qiáng)!

在此文章之前,想學(xué)習(xí)前面部分的請(qǐng)看下列列表

RabbitMQ部署方式(第一節(jié))??

SpringBoot集成RabbitMQ(第二節(jié))??

??簡(jiǎn)述

ACK模式代表的是mq的確認(rèn)機(jī)制,簡(jiǎn)單來(lái)講就是【生產(chǎn)者】在發(fā)送消息的時(shí)候,發(fā)送成功mq有一個(gè)消息收到confirm回調(diào)機(jī)制,發(fā)送失敗有一個(gè)return回調(diào)機(jī)制, 【消費(fèi)者】在接收消息后,在執(zhí)行消費(fèi)完消息需要有一個(gè)確認(rèn)機(jī)制,要告訴mq,這個(gè)消息我消費(fèi)成功了,請(qǐng)將隊(duì)列中的消息刪除,如果是失敗了,你也進(jìn)行確認(rèn)、或者拒絕要告訴mq,不然消息會(huì)一直存在于隊(duì)列中

在RabbitMQ消費(fèi)者中一共有三種模式:

NODE:對(duì)于消息的成功和失敗都不管,MQ隊(duì)列中都會(huì)將消息刪除。(不安全)

AUTO:自動(dòng)確認(rèn)模式,對(duì)于消息消費(fèi)成功,MQ隊(duì)列中的消息將會(huì)自動(dòng)刪除,消費(fèi)失敗則會(huì)一直對(duì)消息進(jìn)行消費(fèi),有沒(méi)有解決方案,當(dāng)然是有的,文章中會(huì)注明(不穩(wěn)定,如果消費(fèi)者不能保證百分百消息成功,auto模式還是不建議使用)

MANUAL:此模式就是對(duì)AUTO模式下新增了一個(gè)確認(rèn)機(jī)制,消費(fèi)者對(duì)消息的消費(fèi)成功和失敗都需要給出一個(gè)消費(fèi)確認(rèn)的標(biāo)識(shí)和動(dòng)作!

開(kāi)啟生產(chǎn)者確認(rèn)機(jī)制:

# 消息發(fā)送交換機(jī),開(kāi)啟確認(rèn)回調(diào)模式

publisher-confirm-type: correlated

# 消息發(fā)送交換機(jī),開(kāi)啟確認(rèn)機(jī)制,并且返回回調(diào)

publisher-returns: true

???模式NONE

application配置

spring:
  application:
    name: rabbitmq-deadLetter
  rabbitmq:
    host: tianyu.com.cn
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 20000
    listener:
      simple:
        acknowledge-mode: none

生產(chǎn)者

@Test
public void workTest() throws InterruptedException {
    for (int i = 1; i <= 10; i++) {
        rabbitTemplate.convertAndSend("work", "[workTest] send 消息發(fā)送" + i);
    }
    Thread.sleep(10000);
    System.out.println("模式:"+rabbitProperties.getListener().getSimple().getAcknowledgeMode());
}

?消費(fèi)者

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;


/**
 * 消費(fèi)者監(jiān)聽(tīng) (第二種模型:工作模式)
 *
 * @author 猿仁
 * @data 2023-01-31 09:38
 */
@Component
@Slf4j
public class WorkCustomer {

    /**
     * 消費(fèi)者1
     *
     * @param data Body響應(yīng)內(nèi)容
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void work1(String data) {
        log.info("[work1]消費(fèi)者消費(fèi)成功success:{}",data);
    }

    /**
     * 消費(fèi)者2
     *
     * @param data Body響應(yīng)內(nèi)容
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue("work"))
    public void work2(String data) {
        // log.info("[work2]消費(fèi)者消費(fèi)成功success:{}",data);
        try {
            int a = 0 / 0;
        }catch (Exception e){
            log.error("[work2]消費(fèi)者消費(fèi)失敗fail:{}",data);
            throw e;
        }
    }
}

結(jié)果驗(yàn)證

channel.basicack(message.getmessageproperties().getdeliverytag(),false);,RabbitMQ系列,java-rabbitmq,rabbitmq,spring boot

結(jié)果解析:

從上面途中可以看出,此模式針對(duì)成功和失敗的消息都是直接成功,只要消費(fèi)者接受到消息(不管消費(fèi)者是否有異常),都當(dāng)作是消費(fèi)成功處理。

優(yōu)點(diǎn)L:此模式很難被阻塞,消費(fèi)能力不足,多開(kāi)幾個(gè)消費(fèi)來(lái)消費(fèi)即可。

缺點(diǎn):失敗的消息被丟棄了,在現(xiàn)實(shí)開(kāi)發(fā)中不允許丟棄消息的(比如:發(fā)貨隊(duì)列,某個(gè)賬號(hào)在通知進(jìn)銷(xiāo)存系統(tǒng)進(jìn)行發(fā)貨時(shí)消息發(fā)送了,但是處理異常直接丟失了,此時(shí)用戶(hù)不知道自己的貨還沒(méi)有發(fā)出,沒(méi)有沒(méi)有短信和物流,貨未發(fā)就沒(méi)有接下來(lái)的一系列消息)

???模式AUTO

application配置

spring:
  application:
    name: rabbitmq-deadLetter
  rabbitmq:
    host: tianyu.com.cn
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 20000
    listener:
      simple:
        acknowledge-mode: auto # 此處開(kāi)啟了,沒(méi)有設(shè)置死信,過(guò)期時(shí)間,最好設(shè)置一下異常不會(huì)回歸隊(duì)列的配置,不然會(huì)出現(xiàn)一直重新消費(fèi)的問(wèn)題。配置如下:
        default-requeue-rejected: false # 是否將失敗消息回歸隊(duì)列

生產(chǎn)者

/**
 * auto模式
 */
@Test
public void autoTest() throws InterruptedException {
    // 開(kāi)啟ack模式 完全消費(fèi),隊(duì)列中無(wú)消息
    rabbitTemplate.convertAndSend("auto_no_err", "測(cè)試auto消費(fèi)者模式");
    // 未開(kāi)啟ack模式 結(jié)果是隊(duì)列中還存在一條等待被消費(fèi)的消息
    rabbitTemplate.convertAndSend("auto_err", "測(cè)試auto消費(fèi)者模式");
    Thread.sleep(3000);
}

消費(fèi)者

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * none消費(fèi)者模式
 *
 * @author tianyu.Ge
 * @date 2023/2/6 12:55
 */

@Component
@Slf4j
public class AutoCustomer {

    /**
     * @param data    Body響應(yīng)內(nèi)容
     * @param headers 請(qǐng)求頭
     * @param channel 通道
     * @param message 消息
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue(value = "auto_no_err", durable = "true", autoDelete = "false"))
    public void autoNoErr(@Payload String data, @Headers Map<String, Object> headers, Channel channel, Message message) {
        System.out.println("獲取到了通道[autoNoErr]的數(shù)據(jù)!" + data);
        log.info("Payload:  {}", data);
        log.info("Headers:  {}", headers);
        log.info("Channel:  {}", channel);
        log.info("Message:  {}", message);
    }

    /**
     * @param data    Body響應(yīng)內(nèi)容
     * @param headers 請(qǐng)求頭
     * @param channel 通道
     * @param message 消息
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue(value = "auto_err", durable = "true", autoDelete = "false"))
    public void autoErr(@Payload String data, @Headers Map<String, Object> headers, Channel channel, Message message) {
        int a = 0 / 0;
        System.out.println("獲取到了通道[autoErr]的數(shù)據(jù)!" + data);
        log.info("Payload:  {}", data);
        log.info("Headers:  {}", headers);
        log.info("Channel:  {}", channel);
        log.info("Message:  {}", message);
    }

}

結(jié)果驗(yàn)證

channel.basicack(message.getmessageproperties().getdeliverytag(),false);,RabbitMQ系列,java-rabbitmq,rabbitmq,spring boot

?

結(jié)果分析:

生產(chǎn)者發(fā)送了兩條消息,一條正常,一條異常,那么在開(kāi)啟了default-requeue-rejected: false這個(gè)回歸隊(duì)列配置,消息只要是消費(fèi)者接收了,就當(dāng)做消費(fèi)成功,不關(guān)心你消費(fèi)者是否在消費(fèi)的途中出現(xiàn)異常,隊(duì)列都將會(huì)刪除隊(duì)列中對(duì)應(yīng)的消息。 如果沒(méi)有配置default-requeue-rejected那么消費(fèi)者出現(xiàn)異常,消息會(huì)重回隊(duì)列,然后由消費(fèi)者重新進(jìn)行消費(fèi),導(dǎo)致一直重復(fù)消費(fèi)!

???模式ACK(重點(diǎn))

?application配置

spring:
  application:
    name: rabbitmq-ack
  rabbitmq:
    host: tianyu.com.cn
    port: 5672
    username: guest
    password: guest
    virtual-host: /
    connection-timeout: 2000000
    listener:
      direct:
        # 采用手動(dòng)應(yīng)答
        acknowledge-mode: manual
      simple:
        # 指定最大的消費(fèi)者數(shù)量
        max-concurrency: 50
        # 指定最小的消費(fèi)者數(shù)量
        concurrency: 1
        # 采用手動(dòng)應(yīng)答
        acknowledge-mode: manual
        retry:
          # 是否開(kāi)啟重試機(jī)制
          enabled: true
          # 默認(rèn)是3,是一共三次,而不是重試三次,三次包含了第一執(zhí)行,所以只重試了兩次
          max-attempts: 3
          # 重試間隔時(shí)間。毫秒
          initial-interval: 2000
        default-requeue-rejected: false

生產(chǎn)者

/**
 * ack模式
 */
@Test
public void ackTest() throws InterruptedException {
    // 開(kāi)啟ack模式 完全消費(fèi),隊(duì)列中無(wú)消息
    rabbitTemplate.convertAndSend("ack_no_err", "測(cè)試ack消費(fèi)者模式");
    // 未開(kāi)啟ack模式 結(jié)果是隊(duì)列中還存在一條等待被消費(fèi)的消息
    rabbitTemplate.convertAndSend("ack_err", "測(cè)試ack消費(fèi)者模式");
    Thread.sleep(6000);
    System.out.println("一共執(zhí)行"+ AckCustomer.count +"次!");
}

消費(fèi)者

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Map;

/**
 * 手動(dòng)確認(rèn)模式 消費(fèi)者模式
 *
 * @author tianyu.Ge
 * @date 2023/2/6 12:55
 */

@Component
@Slf4j
public class AckCustomer {

    // 重試的次數(shù)
    public static int count = 0;

    /**
     * @param data    Body響應(yīng)內(nèi)容
     * @param headers 請(qǐng)求頭
     * @param channel 通道
     * @param message 消息
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue(value = "ack_no_err", durable = "true", autoDelete = "false"))
    public void ackNoErr(@Payload String data, @Headers Map<String, Object> headers, Channel channel, Message message) throws IOException {
        System.out.println("獲取到了通道[ackNoErr]的數(shù)據(jù)!" + data);
        log.info("Payload:  {}", data);
        log.info("Headers:  {}", headers);
        log.info("Channel:  {}", channel);
        log.info("Message:  {}", message);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }

    /**
     * @param data    Body響應(yīng)內(nèi)容
     * @param headers 請(qǐng)求頭
     * @param channel 通道
     * @param message 消息
     * @return void
     * @author 猿仁
     * @date 2023/1/31 9:38
     */
    @RabbitListener(queuesToDeclare = @Queue(value = "ack_err", durable = "true", autoDelete = "false"))
    public void ackErr(@Payload String data, @Headers Map<String, Object> headers, Channel channel, Message message) throws IOException {
        try {
            ++count;
            int a = 0 / 0;
            /**
             * 參數(shù)1:消息標(biāo)簽
             * 參數(shù)2:是否批量確認(rèn),屬于一個(gè)隊(duì)列中的消息,全部確認(rèn),false:只確認(rèn)當(dāng)前消息
             */
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e) {
            log.error("[ackErr]消費(fèi)者出現(xiàn)異常:{}",e.getMessage());
            /**
             * 【否認(rèn)策略】
             *
             *  參數(shù)1:消息標(biāo)簽
             *  參數(shù)2:是否批量處理 true:批量  (通道中A\B\C\D接收到第一個(gè)那么后面的不管成沒(méi)成功都會(huì)被應(yīng)答,不安全,只有在確保通道中的消息百分百消費(fèi)成功時(shí)才可使用),false:只確認(rèn)當(dāng)前消息
             *  參數(shù)3:被拒絕的消息是否回歸隊(duì)列 true:回歸,false:丟棄 【注意】:如果只有一個(gè)消費(fèi)者的話(huà),true將導(dǎo)致無(wú)限循壞, 應(yīng)該改為false:并且通知mq丟棄或者不處理
             */
            //channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false);
            if(count == 3){
                // 當(dāng)執(zhí)行最后一次的時(shí)候,失敗了,那么直接丟棄,從隊(duì)列中刪除
                log.info("[ackErr]一共執(zhí)行{}次,還是失敗,開(kāi)啟確認(rèn)失敗!",count);
                channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false);
            }
            throw e;
        }
        System.out.println("獲取到了通道[ackErr]的數(shù)據(jù)!" + data);
        log.info("Payload:  {}", data);
        log.info("Headers:  {}", headers);
        log.info("Channel:  {}", channel);
        log.info("Message:  {}", message);
    }

}

結(jié)果驗(yàn)證

channel.basicack(message.getmessageproperties().getdeliverytag(),false);,RabbitMQ系列,java-rabbitmq,rabbitmq,spring boot

結(jié)果分析:

開(kāi)啟ack模式,那么不管消費(fèi)者是否執(zhí)行成功或者失敗,都需要給予一個(gè)消息的確認(rèn),成功就確認(rèn)成功,失敗就確認(rèn)失敗,如果沒(méi)有確認(rèn),那么消息一直會(huì)存在隊(duì)列,并且沒(méi)有確認(rèn)ack的消息會(huì)再u(mài)nacked中顯示數(shù)量。

???生產(chǎn)者確認(rèn)機(jī)制

yml添加配置

spring:
  application:
    name: rabbitmq-ack
  rabbitmq:
    # 消息發(fā)送交換機(jī),開(kāi)啟確認(rèn)回調(diào)模式
    publisher-confirm-type: correlated
    # 消息發(fā)送交換機(jī),開(kāi)啟確認(rèn)機(jī)制,并且返回回調(diào)
    publisher-returns: true
#    template:
#      # 指定消息在沒(méi)有被隊(duì)列接收時(shí)是否強(qiáng)行退回還是直接丟棄:ReturnCallback.returnedMessage消息未送達(dá)回調(diào)(true)
#      mandatory: true

修改生產(chǎn)者代碼

/**
 * ack模式之生產(chǎn)者確認(rèn)機(jī)制
 */
@Test
public void ackPublisherTest() throws InterruptedException {
    // 生產(chǎn)者消息確認(rèn)機(jī)制開(kāi)啟
    rabbitTemplate.setConfirmCallback((CorrelationData correlationData, boolean ack, String cause) -> {
        if (ack) {
            System.out.println("ConfirmCallback:correlationData:  " + correlationData);
            System.out.println("ConfirmCallback:correlationData.body:  " + new String(correlationData.getReturnedMessage().getBody()));
            System.out.println("ConfirmCallback:ack:  " + ack);
            System.out.println("ConfirmCallback:cause:  " + cause);
        }else {
            System.out.println("沒(méi)有ack,又是怎樣的,猿友們有空可以研究研究");
        }
    });
    rabbitTemplate.setReturnCallback((Message message, int replyCode, String replyText, String exchange, String routingKey) -> {
        System.out.println("ReturnCallback:  " + message);
        System.out.println("ReturnCallback:  " + replyCode);
        System.out.println("ReturnCallback:  " + replyText);
        System.out.println("ReturnCallback:  " + exchange);
        System.out.println("ReturnCallback:  " + routingKey);
    });
    rabbitTemplate.setMandatory(true);

    // 開(kāi)啟ack模式 完全消費(fèi),隊(duì)列中無(wú)消息
    CorrelationData correlationData = new CorrelationData();
    correlationData.setReturnedMessage(new Message("測(cè)試ack消費(fèi)者模式".getBytes(), new MessageProperties()));
    correlationData.setId("A");
    rabbitTemplate.convertAndSend("ack_no_err", "測(cè)試ack消費(fèi)者模式", (Message message) -> {
        // 可以配置一些request請(qǐng)求參數(shù)
        // message.getMessageProperties().setHeader("token", "123-213-we-123-sd-ad2-");
        //message.getMessageProperties().setContentType(MessageProperties.CONTENT_TYPE_JSON);
        return message;
    }, correlationData);


    // 未開(kāi)啟ack模式 結(jié)果是隊(duì)列中還存在一條等待被消費(fèi)的消息
    CorrelationData correlationData1 = new CorrelationData();
    correlationData1.setReturnedMessage(new Message("測(cè)試ack消費(fèi)者模式".getBytes(), new MessageProperties()));
    correlationData1.setId("B");
    rabbitTemplate.convertAndSend("ack_err", "測(cè)試ack消費(fèi)者模式", (Message message) -> {
        return message;
    }, correlationData1);


    // 沒(méi)有的隊(duì)列名稱(chēng) 這條將會(huì)被ReturnCallback監(jiān)聽(tīng)到,因?yàn)闆](méi)有隊(duì)列ack_err_123,消息不可達(dá)
    rabbitTemplate.convertAndSend("ack_err_123", "測(cè)試ack消費(fèi)者模式");

    Thread.sleep(6000);
    System.out.println("一共執(zhí)行" + AckCustomer.count + "次!");
}

結(jié)果驗(yàn)證

?channel.basicack(message.getmessageproperties().getdeliverytag(),false);,RabbitMQ系列,java-rabbitmq,rabbitmq,spring boot

結(jié)果分析:

開(kāi)啟消息回調(diào),那么生產(chǎn)者在發(fā)送消息的時(shí)候就可以捕捉消息是否發(fā)送成功,發(fā)送成功會(huì)進(jìn)入ConfirmCallback回調(diào)代碼塊,消息發(fā)送失敗會(huì)進(jìn)入?ReturnCallback代碼塊。到這里就完成了消息的確認(rèn)機(jī)制,保證了消息可靠性!

結(jié)束語(yǔ)

溫馨提示:如有問(wèn)題,可在下方留言,作者看到了會(huì)第一時(shí)間回復(fù)!

本章節(jié)完成了,各位正在努力的程序員們,如果你們覺(jué)得本文章對(duì)您有用的話(huà),你學(xué)到了一些東西,希望猿友們點(diǎn)個(gè)贊+關(guān)注,支持一下猿仁!
持續(xù)更新中…文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-765073.html

到了這里,關(guān)于SpringBoot集成RabbitMQ之ACK確認(rèn)機(jī)制(第三節(jié))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • RabbitMQ初級(jí)篇:生產(chǎn)者與消費(fèi)者關(guān)系、消息確認(rèn)機(jī)制(ACK)、交換器與隊(duì)列進(jìn)行消息路由和存儲(chǔ)

    在RabbitMQ中,生產(chǎn)者(Producer) 負(fù)責(zé)發(fā)送消息 ,通常是應(yīng)用程序向RabbitMQ服務(wù)器發(fā)送具有特定路由鍵的消息;消費(fèi)者(Consumer)則 負(fù)責(zé)處理接收到的這些消息 。在RabbitMQ中,生產(chǎn)者和消費(fèi)者之間使用 交換器(Exchange)和隊(duì)列(Queue)進(jìn)行消息路由和存儲(chǔ) 。生產(chǎn)者將消息發(fā)送到

    2024年02月01日
    瀏覽(26)
  • springboot整合rabbitmq的發(fā)布確認(rèn),消費(fèi)者手動(dòng)返回ack,設(shè)置備用隊(duì)列,以及面試題:rabbitmq確保消息不丟失

    springboot整合rabbitmq的發(fā)布確認(rèn),消費(fèi)者手動(dòng)返回ack,設(shè)置備用隊(duì)列,以及面試題:rabbitmq確保消息不丟失

    目錄 1.生產(chǎn)者發(fā)消息到交換機(jī)時(shí)候的消息確認(rèn) 2.交換機(jī)給隊(duì)列發(fā)消息時(shí)候的消息確認(rèn) 3.備用隊(duì)列 3.消費(fèi)者手動(dòng)ack ? rabbitmq的發(fā)布確認(rèn)方式,可以有效的保證我們的數(shù)據(jù)不丟失。 ? 消息正常發(fā)送的流程是:生產(chǎn)者發(fā)送消息到交換機(jī),然后交換機(jī)通過(guò)路由鍵把消息發(fā)送給對(duì)應(yīng)的隊(duì)

    2024年02月09日
    瀏覽(28)
  • 8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    在 RabbitMQ之生產(chǎn)者發(fā)布確認(rèn)原理章節(jié)已經(jīng)介紹了rabbitmq生產(chǎn)者是如何對(duì)消息進(jìn)行發(fā)布確認(rèn)保證消息不丟失的。本章節(jié)繼續(xù)看下springboot整合rabbitmq后是如何保證消息不丟失的。 消息正常是通過(guò)生產(chǎn)者生產(chǎn)消息傳遞到交換機(jī),然后經(jīng)過(guò)交換機(jī)路由到消息隊(duì)列中,最后消費(fèi)者消費(fèi),

    2023年04月25日
    瀏覽(21)
  • kafka ack確認(rèn)機(jī)制

    Kafka使用ACK(Acknowledgment)確認(rèn)機(jī)制來(lái)確保消息在生產(chǎn)者和消費(fèi)者之間的可靠傳遞。這個(gè)機(jī)制確保消息在被認(rèn)為已成功發(fā)送或處理之前不會(huì)被丟失。Kafka的ACK確認(rèn)機(jī)制有三個(gè)級(jí)別: acks=0: 這是最快速的確認(rèn)級(jí)別,也是最不可靠的。生產(chǎn)者發(fā)送消息后不會(huì)等待任何確認(rèn),直接將

    2024年03月16日
    瀏覽(16)
  • 【MQ 系列】SpringBoot + RabbitMq 消息確認(rèn)/事務(wù)機(jī)制的使用姿勢(shì)

    【MQ 系列】SpringBoot + RabbitMq 消息確認(rèn)/事務(wù)機(jī)制的使用姿勢(shì)

    我們知道 RabbitMq 提供了兩種機(jī)制,來(lái)確保發(fā)送端的消息被 brocke 正確接收,本文將主要介紹,在消息確認(rèn)和事物兩種機(jī)制的場(chǎng)景下,發(fā)送消息的使用姿勢(shì) 首先創(chuàng)建一個(gè) SpringBoot 項(xiàng)目,用于后續(xù)的演示 springboot 版本為 2.2.1.RELEASE rabbitmq 版本為? 3.7.5 ? 依賴(lài)配置文件 pom.xml 在 a

    2024年01月18日
    瀏覽(24)
  • 使用StreamBridge實(shí)現(xiàn)RabbitMq 消息收發(fā) && ack確認(rèn) && 延時(shí)消息

    使用StreamBridge實(shí)現(xiàn)RabbitMq 消息收發(fā) && ack確認(rèn) && 延時(shí)消息

    下載地址:link 1.下載完成放到rabbitmq安裝目錄plugins下 2.執(zhí)行命令啟用插件 3.重啟mq Exchanges - add a new exchange - type 出現(xiàn)x-delayed-message即安裝成功

    2024年02月11日
    瀏覽(57)
  • SpringBoot集成常用第三方框架-RabbitMQ

    SpringBoot集成常用第三方框架-RabbitMQ

    作者主頁(yè):編程指南針 作者簡(jiǎn)介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、CSDN博客專(zhuān)家 、CSDN內(nèi)容合伙人、掘金特邀作者、阿里云博客專(zhuān)家、51CTO特邀作者、多年架構(gòu)師設(shè)計(jì)經(jīng)驗(yàn)、騰訊課堂常駐講師 主要內(nèi)容:Java項(xiàng)目、Python項(xiàng)目、前端項(xiàng)目、人工智能與大數(shù)據(jù)、簡(jiǎn)歷模板、學(xué)習(xí)資料、面試題庫(kù)

    2024年01月17日
    瀏覽(90)
  • RabbitMQ的ack和nack機(jī)制

    RabbitMQ的ack和nack機(jī)制

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 當(dāng)生產(chǎn)者的發(fā)送消息到exchange,并路由到對(duì)應(yīng)的隊(duì)列后,MQ主動(dòng)push消息到channel,由應(yīng)用線(xiàn)程從channel中獲取消息。 主動(dòng)ACK是指在MQ主動(dòng)push到channel中后,channel立馬自動(dòng)的給到MQ ack響應(yīng),然后MQ刪除消息。

    2024年02月11日
    瀏覽(18)
  • 【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    ?????????????????????????????????????????????????????????????????? ?? 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q ? 發(fā)布確認(rèn) color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)} 【 R abbi tMQ 教程】第三章 —— R abbi tMQ ? 發(fā)布確認(rèn)

    2024年02月08日
    瀏覽(29)
  • RabbitMQ發(fā)送方確認(rèn)機(jī)制

    RabbitMQ發(fā)送方確認(rèn)機(jī)制

    RabbitMQ消息首先發(fā)送到交換機(jī),然后通過(guò)路由鍵【routingKey】和【bindingKey】比較從而將消息發(fā)送到對(duì)應(yīng)的隊(duì)列【queue】上。在這個(gè)過(guò)程有兩個(gè)地方消息可能會(huì)丟失: 消息發(fā)送到交換機(jī)的過(guò)程。 消息從交換機(jī)發(fā)送到隊(duì)列的過(guò)程。 而RabbitMQ提供了類(lèi)似于回調(diào)函數(shù)的機(jī)制來(lái)告訴發(fā)送

    2024年02月09日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包