91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RocketMQ主從讀寫分離機制的原理是什么

發布時間:2021-06-18 15:52:54 來源:億速云 閱讀:151 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關RocketMQ主從讀寫分離機制的原理是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

RocketMQ 的讀寫分離機制又跟上述描寫的不太一致,RocketMQ 有屬于自己的一套讀寫分離邏輯,它會判斷主服務器的消息堆積量來決定消費者是否向從服務器拉取消息消費。

決定消費者是否向從服務器拉取消息消費的值存在 GetMessageResult 類中:

org.apache.rocketmq.store.GetMessageResult:

private boolean suggestPullingFromSlave = false;

其默認值為 false,即默認消費者不會消費從服務器,以下邏輯可以改變該值:

org.apache.rocketmq.store.DefaultMessageStore#getMessage:

long diff = maxOffsetPy - maxPhyOffsetPulling;
long memory = (long) (StoreUtil.TOTAL_PHYSICAL_MEMORY_SIZE
    * (this.messageStoreConfig.getAccessMessageInMemoryMaxRatio() / 100.0));
getResult.setSuggestPullingFromSlave(diff > memory);

其中 maxOffsetPy 為當前最大物理偏移量,maxPhyOffsetPulling 為本次消息拉取最大物理偏移量,他們的差即可表示消息堆積量,TOTAL_PHYSICAL_MEMORY_SIZE 表示當前系統物理內存,accessMessageInMemoryMaxRatio 的默認值為 40,以上邏輯即可算出當前消息堆積量是否大于物理內存的 40 %,如果大于則將 suggestPullingFromSlave 設置為 true。

接下來該參數值會在消息拉取邏輯里面產生作用:

org.apache.rocketmq.broker.processor.PullMessageProcessor#processRequest:

if (getMessageResult.isSuggestPullingFromSlave()) {
  responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getWhichBrokerWhenConsumeSlowly());
} else {
  responseHeader.setSuggestWhichBrokerId(MixAll.MASTER_ID);
}

switch (this.brokerController.getMessageStoreConfig().getBrokerRole()) {
  case ASYNC_MASTER:
  case SYNC_MASTER:
    break;
  case SLAVE:
    if (!this.brokerController.getBrokerConfig().isSlaveReadEnable()) {
      response.setCode(ResponseCode.PULL_RETRY_IMMEDIATELY);
      responseHeader.setSuggestWhichBrokerId(MixAll.MASTER_ID);
    }
    break;
}

if (this.brokerController.getBrokerConfig().isSlaveReadEnable()) {
  // consume too slow ,redirect to another machine
  if (getMessageResult.isSuggestPullingFromSlave()) {
    responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getWhichBrokerWhenConsumeSlowly());
  }
  // consume ok
  else {
    responseHeader.setSuggestWhichBrokerId(subscriptionGroupConfig.getBrokerId());
  }
} else {
  responseHeader.setSuggestWhichBrokerId(MixAll.MASTER_ID);
}

如果發現主服務器的消息堆積超過了物理內存的 40%,則會設置 suggestWhichBrokerId 為從服務器 broker ID。

這里還會有個 slaveReadEnable 值來決定是否可以從從服務器拉取消息:

  1. 如果 slaveReadEnable=true,并且堆積量已經超過物理內存 40%時,則建議從從服務器拉取消息,否則還是從主服務器拉取消息;

  2. 如果 slaveReadEnable=false,則消息者只能從主服務器中拉取消息。

org.apache.rocketmq.client.impl.consumer.PullAPIWrapper#updatePullFromWhichNode:

public void updatePullFromWhichNode(final MessageQueue mq, final long brokerId) {
    AtomicLong suggest = this.pullFromWhichNodeTable.get(mq);
    if (null == suggest) {
        this.pullFromWhichNodeTable.put(mq, new AtomicLong(brokerId));
    } else {
        suggest.set(brokerId);
    }
}

當消費者收到拉取響應回來的數據后,會將下次建議拉取的 brokerID 緩存起來。下次拉取消息就會從 pullFromWhichNodeTable 中取出拉取 brokerId。

關于RocketMQ主從讀寫分離機制的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富顺县| 新邵县| 清镇市| 喀什市| 伊川县| 融水| 华蓥市| 淮阳县| 太和县| 奎屯市| 永顺县| 大港区| 岳池县| 方正县| 织金县| 房产| 吉林省| 湖南省| 杂多县| 松桃| 淮安市| 六枝特区| 曲水县| 昭觉县| 西乡县| 湟源县| 陇南市| 道孚县| 望城县| 遂昌县| 花莲市| 西充县| 潍坊市| 平山县| 南江县| 三明市| 伊宁市| 弋阳县| 新河县| 无为县| 安宁市|