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

如何保證消息的可靠性(面試題)

這篇具有很好參考價(jià)值的文章主要介紹了如何保證消息的可靠性(面試題)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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

1,消費(fèi)的可靠性保證:

  1. 消息確認(rèn)(Acknowledgements):

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

2.死信隊(duì)列(Dead Letter Queue):

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

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

  1. 消息持久化:

當(dāng)生產(chǎn)者發(fā)布消息時(shí),可以選擇將其標(biāo)記為持久化(persistent).這意味著即使 RabbitMQ 服務(wù)器重啟,消息也不會丟失,因?yàn)樗鼈儠淮鎯υ诖疟P上。

  1. 確認(rèn)(Confirm)機(jī)制:

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

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

1.@PostConstruct注解

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

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

如何保證消息的可靠性(面試題),java,開發(fā)語言,分布式,網(wǎng)絡(luò),運(yùn)維

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

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

生產(chǎn)者到交換機(jī)的確認(rèn)(消息到達(dá)交換機(jī))

配置

spring.rabbitmq.publisher-confirm-type = CORRELATED

代碼實(shí)現(xiàn)

只要到達(dá)交換機(jī)就會觸發(fā)

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

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

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

交換機(jī)到隊(duì)列的確認(rèn)(消息是否正常發(fā)送到了隊(duì)列)

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

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

2.只要有一個(gè)隊(duì)列接受到消息了,它就認(rèn)為成功.

配置

spring.rabbitmq.publisher-returns = true

代碼實(shí)現(xiàn)

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

完整代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-850507.html

@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);
    }

    /**
     * 確認(rèn)消息是否被交換機(jī)接收。
     *
     * @param correlationData 包含消息相關(guān)數(shù)據(jù)的對象,用于識別消息的唯一性。
     * @param ack 表示消息是否被交換機(jī)確認(rèn)接收。
     * @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() : "";
        // 如果消息被確認(rèn)接收,則記錄日志
        if (ack) {
            log.info("交換機(jī)已經(jīng)收到了ID為:{}的消息", id);
        } else {
            // 如果消息未被確認(rèn)接收,則記錄包括未接收原因的日志
            log.info("交換機(jī)還未收到ID為:{}的消息,由于原因:{}", id, cause);
        }

    }

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

到了這里,關(guān)于如何保證消息的可靠性(面試題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Kafka—工作流程、如何保證消息可靠性

    Kafka—工作流程、如何保證消息可靠性

    分布式事件流平臺 。希望不僅僅是存儲數(shù)據(jù),還能夠數(shù)據(jù)存儲、數(shù)據(jù)分析、數(shù)據(jù)集成等功能。消息隊(duì)列(把數(shù)據(jù)從一方發(fā)給另一方),消息生產(chǎn)好了但是消費(fèi)方不一定準(zhǔn)備好了(讀寫不一致),就需要一個(gè)中間商來存儲信息,kafka就是中間商 架構(gòu)圖如下: 名稱 解釋 Broker 消

    2024年02月11日
    瀏覽(26)
  • rabbitmq如何保證消息的可靠性傳輸(簡述版本)?

    我需要從三點(diǎn)去考慮, 生產(chǎn)者弄丟了數(shù)據(jù),生產(chǎn)者將消息發(fā)送的Exchange并且路由到隊(duì)列 隊(duì)列需要將消息給它持久化 消費(fèi)者要成功消費(fèi)隊(duì)列中的消息 RabbitMQ提供了confirm機(jī)制,保證了消息消息發(fā)送的Exchange交換機(jī),那么還提供了return機(jī)制,可以保證消息從exchange路由到隊(duì)列中,如

    2024年02月13日
    瀏覽(23)
  • RabbitMQ如何保證消息的可靠性6000字詳解

    RabbitMQ如何保證消息的可靠性6000字詳解

    RabbitMQ通過生產(chǎn)者、消費(fèi)者以及MQ Broker達(dá)到了解耦的特點(diǎn),實(shí)現(xiàn)了異步通訊等一些優(yōu)點(diǎn),但是在消息的傳遞中引入了MQ Broker必然會帶來一些其他問題,比如如何保證消息在傳輸過程中可靠性(即不讓數(shù)據(jù)丟失,發(fā)送一次消息就會被消費(fèi)一次)?這篇博客將詳細(xì)從生產(chǎn)者,MQ B

    2024年02月16日
    瀏覽(26)
  • IM即時(shí)通訊-N-如何保證消息的可靠性展示

    IM即時(shí)通訊-N-如何保證消息的可靠性展示

    客戶端如何在推拉結(jié)合的模式下保證消息的可靠性展示? 原則: server拉取的消息一定是連續(xù)的 原則: 端側(cè)記錄的消息的連續(xù)段有兩個(gè)作用: 1. 記錄消息的連續(xù)性, 即起始中間沒有斷層, 2. 消息連續(xù), 同時(shí)意味著消息是最新的,消息不是過期的。 同步協(xié)議過載(SyncGapOv

    2023年04月09日
    瀏覽(24)
  • 如何保證消息的可靠性+延遲隊(duì)列(TTL+死信隊(duì)列+延遲隊(duì)列)

    如何保證消息的可靠性+延遲隊(duì)列(TTL+死信隊(duì)列+延遲隊(duì)列)

    目錄 1.如何保證消息的可靠性 1.1.消息的可靠投遞 confirm機(jī)制 return機(jī)制 1.2.如何保證消息在隊(duì)列中不丟失 1.3.確保消息能可靠的被消費(fèi)掉 2.延遲隊(duì)列 2.1.TTL 2.2.死信隊(duì)列 2.3.延遲隊(duì)列 3.如何防止消費(fèi)者重復(fù)消費(fèi)消息 在生產(chǎn)環(huán)境中由于一些不明原因,導(dǎo)致 rabbitmq 重啟,在 RabbitMQ 重

    2024年02月15日
    瀏覽(20)
  • RabbitMQ如何保證消息可靠性,看完這篇文章佬會有新的理解

    RabbitMQ如何保證消息可靠性,看完這篇文章佬會有新的理解

    前言:大家好,我是小威,24屆畢業(yè)生,在一家滿意的公司實(shí)習(xí)。本篇文章將詳細(xì)介紹RabbitMQ的消息可靠性機(jī)制,如消息丟失,消息重復(fù)性消費(fèi),消息積壓等問題。 如果文章有什么需要改進(jìn)的地方還請大佬不吝賜教 ????。 小威在此先感謝各位大佬啦~~???? ??個(gè)人主頁:小

    2024年02月03日
    瀏覽(29)
  • RabbitMQ-保證消息可靠性

    RabbitMQ-保證消息可靠性

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

    2024年02月07日
    瀏覽(31)
  • RabbitMQ保證消息的可靠性

    RabbitMQ保證消息的可靠性

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

    2024年02月19日
    瀏覽(23)
  • TCP消息傳輸可靠性保證

    TCP消息傳輸可靠性保證

    三次握手 TCP 提供面向有連接的通信傳輸。面向有連接是指在數(shù)據(jù)通信開始之前先做好兩端之間的準(zhǔn)備工作。 所謂三次握手是指建立一個(gè) TCP 連接時(shí)需要客戶端和服務(wù)器端總共發(fā)送三個(gè)包以確認(rèn)連接的建立。在socket編程中,這一過程由客戶端執(zhí)行connect來觸發(fā)。 第一次握手:客

    2024年02月12日
    瀏覽(21)
  • RabbitMQ 能保證消息可靠性嗎

    RabbitMQ 能保證消息可靠性嗎

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

    2024年02月16日
    瀏覽(30)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包