真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

RabbitMQ消息丟失問題和保證消息可靠性之消費端不丟消息和HA的示例分析

RabbitMQ消息丟失問題和保證消息可靠性之消費端不丟消息和HA的示例分析,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

站在用戶的角度思考問題,與客戶深入溝通,找到內(nèi)蒙古網(wǎng)站設(shè)計與內(nèi)蒙古網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋內(nèi)蒙古地區(qū)。

上面兩個操作保證消息到服務(wù)端不丟,但是非高可用狀態(tài),如果節(jié)點掛掉,服務(wù)暫時不可用,需要重啟后,消息恢復(fù),消息不會丟失,因為有磁盤存儲。

本文先從消費端講起:

RabbitMQ Server到消費者消息如何不丟?

上面一篇文章也提到了,消費者獲取到消息之后,沒有來得及處理完畢,自己直接宕機了,因為消息者默認采用自動ack,此時RabbitMQ的自動ack機制會通知MQ Server這條消息已經(jīng)處理好了,此時消息就丟了,并不是預(yù)期的。

那么我們采用手動ack機制來解決這個問題,消費端處理完邏輯之后再通知MQ Server,這樣消費者沒處理完消息不會發(fā)送ack,如果在消費者拿到消息,沒來得及處理的情況下自己掛了,此時MQ集群會自動感知到,它就會自覺的重發(fā)消息給其他的消費者服務(wù)實例。

根據(jù)上面的思路你需要完成下面的兩步操作:

第一:消費者監(jiān)聽設(shè)置手動ack

  this.channel = channelManager.getListenerChannel(namespace);
  this.queue = queue;
  this.channel.basicConsume(queue, false, consumerTag, this);
  this.disconnectedCallback.setChannel(channel);

核心代碼: this.channel.basicConsume(queue, false, consumerTag, this); 第二個參數(shù)設(shè)置 false 代表不自動ack

第二:業(yè)務(wù)執(zhí)行完成后手動ack

public static void ack(MessageContext context) {
        long deliveryTag = context.getEnvelope().getDeliveryTag();
        try {
            context.getChannel().basicAck(deliveryTag, false);
        } catch (IOException e) {
            throw new MqAckException("消息ack出錯:連接異?;蜻h端關(guān)閉", context, e);
        }
    }

核心代碼: context.getChannel().basicAck(deliveryTag, false);

這里封裝來,需要業(yè)務(wù)在執(zhí)行完自己的業(yè)務(wù)代碼后,調(diào)用對象channel 的ack方法通知MQServer,說我這邊執(zhí)行完了,你可以刪除了。

注意這里有個問題:如果忘記調(diào)用這個 context.getChannel().basicAck(deliveryTag, false);

或者因為代碼異常,這個代碼沒被執(zhí)行,會怎么樣?后面找時間再寫一篇文章講這個問題。

RabbitMQ Server中存儲的消息高可用

當我們解決了,生產(chǎn)端和消費端的問題后,基本保證消息的不丟問題,但是還有一個是消息的高可用問題,單節(jié)點問題,普通節(jié)點的問題都會影響消息的臨時不可用,這個時候要用上我們的HA 鏡像集群模式來保證。

上一篇文章 解決RabbitMQ消息丟失問題和保證消息可靠性(一) 已經(jīng)提到過,服務(wù)端消息部署的三種模式的區(qū)別,今天就專門講鏡像模式的介紹。

鏡像模式至少采用3節(jié)點,2個磁盤節(jié)點和1個內(nèi)存節(jié)點來保證,架構(gòu)圖:

RabbitMQ消息丟失問題和保證消息可靠性之消費端不丟消息和HA的示例分析

設(shè)置鏡像也有一些策略:

  • 同步至所有的,一般不這么做,性能會受到極大影響

  • 同步最多N個機器

  • 只同步至符合指定名稱的nodes

> 命令處理HA策略模版:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

  1. 為每個以“rock.wechat”開頭的隊列設(shè)置所有節(jié)點的鏡像,并且設(shè)置為自動同步模式

rabbitmqctl set_policy ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
rabbitmqctl set_policy -p rock ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  1. 為每個以“rock.wechat.”開頭的隊列設(shè)置兩個節(jié)點的鏡像,并且設(shè)置為自動同步模式

rabbitmqctl set_policy -p rock ha-exacly "^rock.wechat" \
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
  1. 為每個以“node.”開頭的隊列分配指定的節(jié)點做鏡像

rabbitmqctl set_policy ha-nodes "^nodes\." \
'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

> 但是:HA 鏡像隊列有一個很大的缺點就是: 系統(tǒng)的吞吐量會有所下降

所以采用鏡像模式,要根據(jù)具體的業(yè)務(wù)規(guī)則定制話處理,沒那么重要的業(yè)務(wù),消息丟了也沒關(guān)系的場景,又要求必須高的性能的時候,鏡像也可以不用設(shè)置。

關(guān)于RabbitMQ消息丟失問題和保證消息可靠性之消費端不丟消息和HA的示例分析問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。


網(wǎng)頁名稱:RabbitMQ消息丟失問題和保證消息可靠性之消費端不丟消息和HA的示例分析
當前鏈接:http://weahome.cn/article/pjccee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部