国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

阿里二面:RocketMQ 集群 Broker 掛了,會造成什么影響?

開發(fā) 架構(gòu)
今天分享 RocketMQ 的 Broker 掛了,會帶來什么影響。

大家好,我是君哥。今天分享 RocketMQ 的 Broker 掛了,會帶來什么影響。

面試官:你好,如果 RocketMQ 集群中的一個 Broker 掛了,會造成什么影響呢? 

:Broker 掛了,首先會導(dǎo)致 Producer 發(fā)送消息失敗。對于普通消息,Producer 同步發(fā)送的情況下會有重試機制,重試時把消息發(fā)送到其他 Broker。如下圖,Broker1 宕機了,把消息發(fā)送到了 Broker2:

圖片

發(fā)送消息的邏輯其實是是一個循環(huán),發(fā)送失敗后會不斷嘗試重新發(fā)送,代碼如下:

int timesTotal = communicationMode == CommunicationMode.SYNC ? 1 + this.defaultMQProducer.getRetryTimesWhenSendFailed() : 1;
for (; times < timesTotal; times++) {
String lastBrokerName = null == mq ? null : mq.getBrokerName();
MessageQueue mqSelected = this.selectOneMessageQueue(topicPublishInfo, lastBrokerName);
if (mqSelected != null) {
mq = mqSelected;
try {
sendResult = this.sendKernelImpl(msg, mq, communicationMode, sendCallback, topicPublishInfo, timeout - costTime);
switch (communicationMode) {
case ASYNC:
return null;
case ONEWAY:
return null;
case SYNC:
if (sendResult.getSendStatus() != SendStatus.SEND_OK) {
//如果發(fā)送失敗了,這里會進行重試
if (this.defaultMQProducer.isRetryAnotherBrokerWhenNotStoreOK()) {
continue;
}
}
return sendResult;
default:
break;
}
} catch (RemotingException e) {
}//省略其他 catch
} else {
break;
}
}

對于異步發(fā)送和單邊消息是不會重試的,因此對于異步和單邊消息,就只能發(fā)送失敗了。而對于同步消息,可以通過重試的方式發(fā)送到其他的 Broker 上。

面試官:在同步的情況下,Producer 重試時怎么保證不把消息發(fā)送到掛掉的 Broker 上呢? 

:Producer 默認采用 round-robin 的方式,重試前會記錄上一次發(fā)送消息的 Broker,然后選擇下一個 Broker。代碼如下:

//lastBrokerName 記錄了上一次發(fā)送的 Broker Name
public MessageQueue selectOneMessageQueue(final String lastBrokerName) {
if (lastBrokerName == null) {
return selectOneMessageQueue();
} else {
for (int i = 0; i < this.messageQueueList.size(); i++) {
int index = this.sendWhichQueue.incrementAndGet();
int pos = Math.abs(index) % this.messageQueueList.size();
if (pos < 0)
pos = 0;
MessageQueue mq = this.messageQueueList.get(pos);
//Broker Name 不等于上次的,才會返回
if (!mq.getBrokerName().equals(lastBrokerName)) {
return mq;
}
}
return selectOneMessageQueue();
}
}

面試官:在大流量的場景下,可能會有大量消費發(fā)送到失敗的 Broker,這樣導(dǎo)致大量的消息需要重試,對性能影響會很大,有什么解決方法嗎?

:RocketMQ 有延遲隔離策略,如果發(fā)送某一個 Broker 失敗了,會將其隔離,優(yōu)先選擇正常的 Broker 發(fā)送消息。需要注意的是,這個策略默認是不開啟的。

面試官:怎么開啟延遲隔離策略呢? 

:需要在初始化 Producer 的時候定義,見下面代碼第二行:

DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
producer.setSendLatencyFaultEnable(true);
producer.start();

開啟之后,發(fā)送消息時會記錄發(fā)送消息花費的時間下面 latencyMax 變量,超過一定時間,這個 Broker 就會在一段時間內(nèi)不允許發(fā)送(下面 notAvailableDuration 變量)。

private long[] latencyMax = {50L, 100L, 550L, 1000L, 2000L, 3000L, 15000L};
private long[] notAvailableDuration = {0L, 0L, 30000L, 60000L, 120000L, 180000L, 600000L};

具體邏輯可以參考類 MQFaultStrategy。

面試官:剛剛聊的是對普通消息的影響,那對順序消息有什么影響呢?

:對于全局順序消息,如果設(shè)置了所有消息要發(fā)送到同一個 Broker 的同一個 MessageQueue 中的情況,恰好是這個 Broker 掛了,那就只能等 Broker 重啟后再發(fā)送了。而對于局部順序消息,比如同一個訂單相關(guān)的消息要發(fā)送到同一個 Broker 的同一個 MessageQueue 中的情況,如果這個 Broker 掛了,那 MessageQueueSelector 會選擇其他 Broker 上的 MessageQueue 進行發(fā)送,這會影響當(dāng)前這筆訂單消費的順序性。而其他訂單可以被 Producer 發(fā)送到其他的隊列中,不受影響。如下圖:

圖片

Broker1 掛之前,Order1 的消息發(fā)送到了 Broker1,Broker1 掛之后,Order1 的消息被發(fā)送到了 Broker2。在 Broker1 恢復(fù)前,消費者只能消費 Broker2 上拉取 Order1 的消息,Broker1 恢復(fù)后消費者線程再從 Broker1 拉取,因此 Order1 的消息產(chǎn)生亂序。這里假設(shè)沒有從節(jié)點。

面試官:Broker 掛了,對 消費者有影響嗎? 

:如果 Broker 沒有設(shè)置主從集群,消費者會繼續(xù)從掛掉的 Broker 上拉取,這會導(dǎo)致拉取失敗,直到 NameServer 更新了 Broker 列表。

面試官:NameServer 什么時候會更新 Broker 列表呢? 

:NameServer 會有每 10s 一次的定時任務(wù)檢查 Broker 是否下線了,如果 120s 內(nèi)有沒有收到 Broker 心跳,則關(guān)閉 channel,把 Broker 信息從本地緩存移除。消費者則默認每隔 30s 向 NameServer 拉取路由信息來刷新本地緩存的 Broker 列表。也就是說可能會有最多 150s 的時間消費者拉取消息失敗。如下圖:

圖片

面試官:如果 Broker 集群配置了從節(jié)點,還會有上面的影響嗎? 

:如果有從節(jié)點,在 Broker 主節(jié)點恢復(fù)前,生產(chǎn)者是不能往從節(jié)點發(fā)送消息的,但是消費者可以去從節(jié)點拉取消息。

面試官:消費者什么時候會去 Broker 從節(jié)點拉取消息呢? 

:Broker 掛了以后,消費組會通過向 Name Server 拉取訂閱關(guān)系來更新本地緩存的 Broker 列表,因為主節(jié)點已經(jīng)不在列表中了,所以會從從節(jié)點列表中選擇一個 Broker 進項消息拉取。

面試官:如果主節(jié)點沒有掛,消費者會去從節(jié)點拉取消息嗎? 

:在主節(jié)點系統(tǒng)壓力較大的時候,消費者也會去從節(jié)點拉取消息??梢詤⒖枷旅娴拇a:

//DefaultMessageStore 類
//maxOffsetPy:最大物理偏移量
//maxPhyOffsetPulling:這次消息拉取的最大偏移量
//diff:還沒有被拉取的消息總長度
long diff = maxOffsetPy - maxPhyOffsetPulling;
//TOTAL_PHYSICAL_MEMORY_SIZE:系統(tǒng)總的物理內(nèi)存大小
//getAccessMessageInMemoryMaxRatio 默認是 40
long memory = (long) (StoreUtil.TOTAL_PHYSICAL_MEMORY_SIZE
* (this.messageStoreConfig.getAccessMessageInMemoryMaxRatio() / 100.0));
getResult.setSuggestPullingFromSlave(diff > memory);

從上面的代碼可以看出,當(dāng)未處理的消息超出物理內(nèi)存 40% 時就會去從節(jié)點拉取。需要注意兩點:

  1. 需要設(shè)置 slaveReadEnable 參數(shù)為 true,才能去從節(jié)點讀取數(shù)據(jù)。
  2. 需要配置 whichBrokerWhenConsumeSlowly 參數(shù)來決定從哪個從 brokerId 讀取。參考下面這段代碼:
if (this.brokerController.getBrokerConfig().isSlaveReadEnable()) {
// consume too slow ,redirect to another machine
if (getMessageResult.isSuggestPullingFromSlave()) {
//這里配置從哪個從節(jié)點拉取
responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getWhichBrokerWhenConsumeSlowly());
}
//...
}
  1. brokerId 默認是 0,也就是主節(jié)點,如果主節(jié)點掛了并且長期啟動失敗,這個參數(shù)也是需要改成可以長期拉取的一個從節(jié)點。

面試官:Broker 主節(jié)點掛了,如果成功從節(jié)點拉取消息,可能會重復(fù)消費嗎?

:對于廣播模式,消息偏移量是保存在消費者本地的,只要消費者不掛,按照內(nèi)存中的偏移量去從節(jié)點拉取就行了,不會有問題。對于集群模式,消息偏移量保存在 Broker,路徑如下:

/${rocketmq.client.localOffsetStoreDir}/.rocketmq_offsets/${clientId}/${groupName}/offsets.json

消費者消費完一批消息后,會向 Broker 發(fā)送請求更新 Broker 內(nèi)存中保存的偏移量,內(nèi)存中的偏移量會定時(每 5s 一次)更新到上面文件中。如果 Broker 主節(jié)點不掛,無論消費者從主節(jié)點還是從節(jié)點拉取消息,更新偏移量的請求都會發(fā)送到主節(jié)點,從節(jié)點會每隔 10s 從主節(jié)點同步偏移量,如下圖:

圖片

代碼如下:

//BrokerController 類 handleSlaveSynchronize
if (role == BrokerRole.SLAVE) {
slaveSyncFuture = this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
BrokerController.this.slaveSynchronize.syncAll();
}
}
}, 1000 * 3, 1000 * 10, TimeUnit.MILLISECONDS);
}

也就是說,如果主節(jié)點掛了,去從節(jié)點拉取消息,可能因為偏移量沒有同步到主節(jié)點,從節(jié)點保存的偏移量不正確。不過只要消費者不宕機,就會根據(jù)消費者本地保存的偏移量去拉取,并不會拉取到重復(fù)消息。

面試官:如果 Broker 主節(jié)點重啟了,主節(jié)點并不能同步從節(jié)點的最新偏移量,那消費者從主節(jié)點讀取會讀到重復(fù)消息嗎? 

:如果主節(jié)點重啟了,如果消費者會用本地保存的偏移量去主節(jié)點拉取消息,主節(jié)點會更新本地的偏移量,同時從節(jié)點也會去主節(jié)點同步偏移量,所以并不會拉取到重復(fù)消息。如果消費者也掛了,消費者重啟后 Broker 主節(jié)點的偏移量還沒有被其他消費者更新過,那確實會拉取到重復(fù)消息。

面試官:恭喜你,通過了。

責(zé)任編輯:姜華 來源: 君哥聊技術(shù)
相關(guān)推薦

2022-10-18 08:38:16

內(nèi)存泄漏線程

2022-06-02 10:54:16

BrokerRocketMQ

2021-04-25 09:58:48

mmapJava面試

2021-03-17 15:54:32

IO零拷貝方式

2025-07-01 07:21:15

2021-10-27 20:54:24

分庫分表高并發(fā)

2022-05-02 16:18:22

RocketMQBrokertopic

2022-03-14 11:05:01

RocketMQRedis緩存

2024-05-24 10:15:36

2022-09-13 14:42:35

Redis內(nèi)存函數(shù)

2021-12-28 14:53:47

Java編程語言

2024-12-16 09:11:57

2024-03-22 13:31:00

線程策略線程池

2022-04-15 11:26:14

緩存功能

2013-04-25 11:45:39

Google Glas

2020-10-27 08:58:47

設(shè)計NUMA內(nèi)存

2021-06-17 09:16:34

MySQL數(shù)據(jù)庫隔離級別

2025-02-26 07:53:21

2023-10-30 01:02:56

Java類類加載器雙親委派

2019-08-07 15:51:15

5G網(wǎng)絡(luò)運營商
點贊
收藏

51CTO技術(shù)棧公眾號

欧美综合视频在线观看| 欧美另类视频在线| 欧美精品成人一区二区三区四区| 中文字幕一区三区| 欧美一级一级性生活免费录像| 亚洲视频资源| 亚洲欧美日韩精品一区二区| 色一情一乱一乱一91av| 国产精品一二三在线| 午夜精彩视频在线观看不卡| 这里只有精品99re| 精品视频在线播放色网色视频| 欧美韩国理论所午夜片917电影| 成人中文字幕+乱码+中文字幕| 日韩欧美一区三区| 色综合视频一区二区三区44| 国内精品伊人久久久久av影院 | 久久婷婷人人澡人人喊人人爽| 成年人羞羞的网站| 奇米影视亚洲| 亚洲韩国精品一区| 国产精品一区二区免费| 国产高清在线看| 国产亚洲一二三区| 94色蜜桃网一区二区三区| 一区二区三区影院| 伊人久久综合一区二区| 国模无码视频一区二区三区| 日本福利午夜视频在线| av蜜臀在线| 亚洲成av人片乱码色午夜| 国产成人精品三级| 亚洲人成在线观看一区二区| 亚洲精品suv精品一区二区| 久久久精品在线观看| 国产欧美欧洲| 黄色无遮挡网站| 天堂中文最新版在线中文| 亚洲色图欧美| 国产精品女同互慰在线看| 久草中文综合在线| 国产欧美一区二区精品忘忧草| 欧美高清一区| 中文字幕精品一区二区精品绿巨人| 两个人hd高清在线观看| 亚洲国产精品三区| 全球最大av网站久久| 国产91白丝在线播放| 91麻豆精品国产91久久久久推荐资源| 韩日成人在线| 亚洲一区精品在线| 久久青草福利网站| 欧美在线观看视频网站| 日韩国产欧美一区二区| 狠狠做深爱婷婷久久综合一区| 成人在线小视频| 一级网站免费观看| 国产精品迅雷| 葵司免费一区二区三区四区五区| 日韩第一页在线| 欧美一区二区三区在线电影| 亚洲欧洲精品一区二区| 成人av色网站| 亚洲精品免费在线| 国产91av视频在线观看| 先锋av资源在线| 国产91高潮流白浆在线麻豆| 日本特黄a级片| 欧美精品v日韩精品v韩国精品v| 国产精品乱码视频| 99久久99视频只有精品| 久久精品中文字幕电影| 麻豆免费看一区二区三区| 男同互操gay射视频在线看| 精品精品精品| 国产精品久久久久久久久晋中 | 国产精品免费丝袜| 欧美精品一区二区三区四区五区| 四虎永久在线高清国产精品| 97精品国产| 久久成人精品视频| 日韩精品一区二区三区视频在线观看| aa在线免费观看| 国产日韩一区二区三区在线| 色婷婷av一区二区三区久久| 国产视频三级在线观看播放| 欧美禁忌电影网| 欧美日本乱大交xxxxx| 情趣视频网站在线免费观看| 久久亚洲精品伦理| 日本一区二区三区视频视频| 中文成人av在线| 97色在线观看| 美女免费视频一区| 亚洲xxx视频| 91久久久久| 激情综合网五月激情 | 三级三级久久三级久久18| 国产精品99一区二区| 99久久久精品视频| 日本不良网站在线观看| 亚洲精品国产福利| 国产一区二区不卡| 搞黄网站在线看| 99re6这里有精品热视频| 国产午夜精品免费一区二区三区 | 欧美日韩在线观看一区二区| 国产日产一区二区三区| 91麻豆精品激情在线观看最新 | 亚洲第一福利一区| av在线三区| 91中文在线视频| 久久九九久精品国产免费直播| 久久成人这里只有精品| 99精品国产热久久91蜜凸| 国产精品对白| 成a人v在线播放| 天天综合网日韩| 成人在线免费av| 在线视频亚洲自拍| 日本不卡免费高清视频| 国产日韩精品一区二区浪潮av| 日韩超碰人人爽人人做人人添| 亚欧精品一区| 国产精品v欧美精品v日韩精品| 日韩第一区第二区| 久久久久久欧美精品色一二三四| 舔着乳尖日韩一区| 欧美人与禽猛交乱配视频| 亚洲视频资源在线| www.51av欧美视频| 久久伦理网站| 一本色道久久88精品综合| 成人综合婷婷国产精品久久免费| 国产精品白丝久久av网站| 精品一区二区三区的国产在线播放 | 久久成人在线| 精品91在线| 欧美人与性动交α欧美精品济南到 | 国产不卡一区二区在线观看| 久草热8精品视频在线观看| 免费福利在线观看| 亚洲在线免费视频| 一区二区三区在线免费观看| 日韩午夜在线| 91久久高清国语自产拍| 欧美视频第一| 国产网红在线观看| 黄色成年人视频在线观看| 国产精品三级a三级三级午夜| 亚洲精蜜桃久在线| 国产成人免费观看| 国产精品99一区| 精品自在线视频| 国产一区二区三区在线观看视频 | 色婷婷综合在线| 久久激五月天综合精品| 亚洲最大的成人网| 亚洲成人手机在线| 国产精一品亚洲二区在线视频| 国产一区一区| yourporn在线观看中文站| 欧美日韩在线视频一区二区三区| 日本在线观看天堂男亚洲| 日韩欧美一级二级三级| 日日骚欧美日韩| 国产精品综合色区在线观看| 精品久久视频| 国产极品一区| 日韩在线国产精品| 97国产在线| 久久国产成人精品| 青草影视电视剧免费播放在线观看| 成人亚洲在线观看| 2021av天天| 在线视频色在线| 国产在线69| 超级碰碰久久| 999精品一区| 欧美特黄一区| 亚洲看片免费| 91亚洲国产成人精品一区二三| 中文子幕无线码一区tr| 欧美日韩精品专区| 久久精品视频一| 亚洲一区二区中文| 久章草在线视频| 精品国产乱码久久久久久久| 北条麻妃在线一区二区| 亚洲自拍偷拍欧美| 综合精品久久| 国产伦精品一区二区三区免费迷| 久久福利一区| 欧美日韩加勒比精品一区| 欧美影院一区二区| 国产精品18久久久久久首页狼| 日韩欧美国产免费| 粉嫩av一区二区三区四区五区| 久久久精品午夜少妇| 亚洲成人免费观看|