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

RabbitMQ消息的可靠性

這篇具有很好參考價值的文章主要介紹了RabbitMQ消息的可靠性。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

面試題:Rabbitmq怎么保證消息的可靠性?

1.消費端消息可靠性保證:

  1. 消息確認(Acknowledgements)

消費者在接收到消息后,默認情況下RabbitMQ會自動確認消息(autoAck=true)。為保證消息可靠性,可以設(shè)置autoAck=false,使得消費者在處理完消息后手動發(fā)送確認(basicAck)。如果消費者在處理過程中發(fā)生異?;蛘呶赐瓿商幚砭徒K止運行,那么消息在超時時間內(nèi)將不會被刪除,會再次被RabbitMQ投遞給其他消費者。

2.死信隊列(Dead Letter Queue)

當(dāng)消息不能被正常消費時(比如達到最大重試次數(shù)),可以通過設(shè)置TTL(Time To Live)或者死信交換器(Dead Letter Exchange)將消息路由至死信隊列,從而有機會后續(xù)分析和處理這些無法正常消費的消息。

2.生產(chǎn)端消息可靠性保證:

  1. 消息持久化

當(dāng)生產(chǎn)者發(fā)布消息時,可以選擇將其標(biāo)記為持久化(persistent).這意味著即使 RabbitMQ 服務(wù)器重啟,消息也不會丟失,因為它們會被存儲在磁盤上。

  1. 確認(Confirm)機制

開啟confirm回調(diào)模式后,RabbitMQ會在消息成功寫入到磁盤并至少被一個交換器接受后,向生產(chǎn)者發(fā)送一個確認(acknowledgement)。若消息丟失或無法投遞給任何隊列,RabbitMQ將會發(fā)送一個否定確認(nack). 生產(chǎn)者可以根據(jù)這些確認信號判斷消息是否成功送達并采取相應(yīng)的重試策略。

RabbitMQ作為消息中間件并啟用publisher confirms(發(fā)布者確認)與publisher returns(發(fā)布者退回)機制時,可以確保消息從生產(chǎn)者到交換機的投遞過程得到更準(zhǔn)確的狀態(tài)反饋。

1.@PostConstruct注解

@PostConstruct注解是Java EE規(guī)范中的一部分,主要用于標(biāo)記在一個Bean初始化完成后需要執(zhí)行的方法。這個注解由JSR-250定義,并且在Spring框架以及其他遵循Java EE標(biāo)準(zhǔn)的應(yīng)用服務(wù)器中廣泛支持。

**功能與用途:初始化方法,**當(dāng)容器完成對Bean的實例化并且所有依賴注入完成后,將會自動調(diào)用標(biāo)有@PostConstruct注解的方法。這為開發(fā)者提供了一個機會,在對象正式投入使用之前進行一些必要的初始化工作,比如初始化資源、預(yù)計算某些值、啟動后臺任務(wù)等增強。

2. Publisher Confirms(發(fā)布者確認)

作用: Publisher Confirm機制允許RabbitMQ服務(wù)器通知生產(chǎn)者一個消息是否已經(jīng)被交換機正確接收。當(dāng)publisher-confirm-type設(shè)置為CORRELATED時,RabbitMQ會向生產(chǎn)者發(fā)送確認或否定響應(yīng),確認消息已到達交換機,但不保證消息已被路由到至少一個隊列中。

生產(chǎn)者到交換機的確認(消息到達交換機)

2.1.配置:

spring.rabbitmq.publisher-confirm-type = CORRELATED

2.2. 代碼實現(xiàn)

只要到達交換機就會觸發(fā)

rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            // 消息成功投遞成功并被確認
        } else {
            // 消息未能正確投遞
        }
    }
});

3.Publisher Returns(發(fā)布者退回)

作用: Publisher Return機制用于當(dāng)消息無法按照路由鍵規(guī)則路由到任何隊列時,或者由于其他原因(例如隊列滿、消息過大等)而被交換機拒絕時,RabbitMQ將消息返回給生產(chǎn)者。

交換機到隊列的確認(消息是否正常發(fā)送到了隊列)

通過實現(xiàn) ReturnCallback 接口,發(fā)送消息失敗返回,比如交換機路由不到隊列時觸發(fā)回調(diào):

1.只有消息沒有路由到隊列的時候,才觸發(fā)該回調(diào) .

2.只要有一個隊列接受到消息了,它就認為成功.文章來源地址http://www.zghlxwxcb.cn/news/detail-850953.html

3.1 配置

spring.rabbitmq.publisher-returns = true

3.2 代碼實現(xiàn)

rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        // 處理未被路由或因某種原因被退回的消息
    }
});

4.完整代碼



@Slf4j
@Service
public class DirectProvider implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //注解是專門數(shù)據(jù)初始化的注解, 只有其他組件注入后,初始化方法才會執(zhí)行,
    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    public  void  send(OrderingOk orderingOk){

        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        System.out.println("callbackSender UUID: " + correlationData.getId());
        rabbitTemplate.convertAndSend(
                "Direct_E01", 
                "test",orderingOk,
                m-> m,correlationData);
    }

    /**
     * 確認消息是否被交換機接收。
     *
     * @param correlationData 包含消息相關(guān)數(shù)據(jù)的對象,用于識別消息的唯一性。
     * @param ack 表示消息是否被交換機確認接收。
     * @param cause 如果消息未被接收,提供未接收的原因。
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 獲取相關(guān)數(shù)據(jù)的ID,如果相關(guān)數(shù)據(jù)為空,則設(shè)置為空字符串
        String id = correlationData != null ? correlationData.getId() : "";
        // 如果消息被確認接收,則記錄日志
        if (ack) {
            log.info("交換機已經(jīng)收到了ID為:{}的消息", id);
        } else {
            // 如果消息未被確認接收,則記錄包括未接收原因的日志
            log.info("交換機還未收到ID為:{}的消息,由于原因:{}", id, cause);
        }

    }

    /**
     * 記錄被交換機退回的消息信息。
     *
     * @param message 消息對象,包含消息體。
     * @param replyCode 返回的響應(yīng)代碼,用于指示退回的原因。
     * @param replyText 返回的響應(yīng)文本,提供關(guān)于退回的詳細信息。
     * @param exchange 退回時涉及的交換機名稱。
     * @param routingKey 退回時使用的路由鍵。
     */
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        // 記錄消息退回的日志信息
        log.info("消息{},被交換機:{}退回,原因是:{},路由key是:{}", new String(message.getBody()), exchange, replyCode, replyText, routingKey);
    }


到了這里,關(guān)于RabbitMQ消息的可靠性的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • RabbitMQ高級篇---消息可靠性

    RabbitMQ高級篇---消息可靠性

    1、消息可靠性: 消息從發(fā)送到消費者接受,會經(jīng)歷多個過程,每個消息傳遞的過程都可能導(dǎo)致消息的丟失: 常見的丟失原因: 發(fā)送時消息丟失原因: 生產(chǎn)者發(fā)送的消息未送達exchange 消息到達exchange后未到達queue MQ宕機,queue將消息丟失 consumer接收到消息后未消費就宕機 Rab

    2024年01月20日
    瀏覽(30)
  • RabbitMQ保證消息的可靠性

    RabbitMQ保證消息的可靠性

    消息從發(fā)送,到消費者接收,會經(jīng)理多個過程: 其中的每一步都可能導(dǎo)致消息丟失,常見的丟失原因包括: 發(fā)送時丟失: 生產(chǎn)者發(fā)送的消息未送達exchange 消息到達exchange后未到達queue MQ宕機,queue將消息丟失 consumer接收到消息后未消費就宕機 針對這些問題,RabbitMQ分別給出了

    2024年02月19日
    瀏覽(23)
  • 【RabbitMQ】之消息的可靠性方案

    【RabbitMQ】之消息的可靠性方案

    一、數(shù)據(jù)丟失場景 二、數(shù)據(jù)可靠性方案 1、生產(chǎn)者丟失消息解決方案 2、MQ 隊列丟失消息解決方案 3、消費者丟失消息解決方案 MQ 消息數(shù)據(jù)完整的鏈路為 :從 Producer 發(fā)送消息到 RabbitMQ 服務(wù)器中,再由 Broker 服務(wù)的 Exchange 根據(jù) Routing_Key 路由到指定的 Queue 隊列中,最后投送到消

    2024年02月14日
    瀏覽(24)
  • RabbitMQ之消息的可靠性傳遞

    提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 RabbitMQ之消息的可靠性傳遞 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: 在當(dāng)今的信息化時代,消息傳遞在企業(yè)級應(yīng)用和分布式

    2024年01月19日
    瀏覽(21)
  • RabbitMQ消息可靠性問題及解決

    RabbitMQ消息可靠性問題及解決

    說明:在RabbitMQ消息傳遞過程中,有以下問題: 消息沒發(fā)到交換機 消息沒發(fā)到隊列 MQ宕機,消息在隊列中丟失 消息者接收到消息后,未能正常消費(程序報錯),此時消息已在隊列中移除 針對以上問題,提供以下解決方案: 消息確認:確認消息是否發(fā)送到交換機、隊列;

    2024年02月16日
    瀏覽(21)
  • rabbitmq如何保證消息的可靠性

    RabbitMQ可以通過以下方式來保證消息的可靠性: 在發(fā)布消息時,可以設(shè)置消息的delivery mode為2,這樣消息會被持久化存儲在磁盤上,即使RabbitMQ服務(wù)器重啟,消息也不會丟失。 可以創(chuàng)建持久化的隊列,這樣即使RabbitMQ服務(wù)器重啟,隊列也不會丟失。 在消費者端,可以 設(shè)置手動

    2024年01月23日
    瀏覽(26)
  • RabbitMQ 能保證消息可靠性嗎

    RabbitMQ 能保證消息可靠性嗎

    手把手教你,本地RabbitMQ服務(wù)搭建(windows) 消息隊列選型——為什么選擇RabbitMQ RabbitMQ靈活運用,怎么理解五種消息模型 推或拉? RabbitMQ 消費模式該如何選擇 死信是什么,如何運用RabbitMQ的死信機制? 前面我們在做MQ組件選型時,提到了rabbitMQ的消息可靠性,那么它到底可靠

    2024年02月16日
    瀏覽(29)
  • 如何保證 RabbitMQ 的消息可靠性?

    如何保證 RabbitMQ 的消息可靠性?

    項目開發(fā)中經(jīng)常會使用消息隊列來 完成異步處理、應(yīng)用解耦、流量控制等功能 。雖然消息隊列的出現(xiàn)解決了一些場景下的問題,但是同時也引出了一些問題,其中使用消息隊列時如何保證消息的可靠性就是一個常見的問題。 如果在項目中遇到需要保證消息一定被消費的場景

    2024年02月07日
    瀏覽(27)
  • Rabbitmq怎么保證消息的可靠性?

    Rabbitmq怎么保證消息的可靠性?

    一、消費端消息可靠性保證 : 消息確認(Acknowledgements) : 消費者在接收到消息后,默認情況下RabbitMQ會自動確認消息(autoAck=true)。為保證消息可靠性,可以設(shè)置autoAck=false,使得消費者在處理完消息后手動發(fā)送確認(basicAck)。如果消費者在處理過程中發(fā)生異?;蛘呶赐瓿?/p>

    2024年04月14日
    瀏覽(24)
  • RabbitMQ消息可靠性(一)-- 生產(chǎn)者消息確認

    RabbitMQ消息可靠性(一)-- 生產(chǎn)者消息確認

    目錄 前言 一、消息確認流程圖 二、生產(chǎn)者消息確認 1、publisher-confirm(發(fā)送者確認) 2、publisher-return(發(fā)送者回執(zhí)) 三、代碼實現(xiàn) 1、修改application.yml 配置 2、ConfirmCallback函數(shù)和ReturnCallback函數(shù) 在項目中,引入了RabbitMQ這一中間件,必然也需要在業(yè)務(wù)中增加對數(shù)據(jù)安全性的一

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包