這篇文章將為大家詳細講解有關RocketMQ主從讀寫分離機制的原理是什么,文章內(nèi)容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
創(chuàng)新互聯(lián)主營黃陂網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app開發(fā)定制,黃陂h5小程序制作搭建,黃陂網(wǎng)站營銷推廣歡迎黃陂等地區(qū)企業(yè)咨詢
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 表示當前系統(tǒng)物理內(nèi)存,accessMessageInMemoryMaxRatio 的默認值為 40,以上邏輯即可算出當前消息堆積量是否大于物理內(nèi)存的 40 %,如果大于則將 suggestPullingFromSlave 設置為 true。
接下來該參數(shù)值會在消息拉取邏輯里面產(chǎn)生作用:
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); }
如果發(fā)現(xiàn)主服務器的消息堆積超過了物理內(nèi)存的 40%,則會設置 suggestWhichBrokerId 為從服務器 broker ID。
這里還會有個 slaveReadEnable 值來決定是否可以從從服務器拉取消息:
如果 slaveReadEnable=true,并且堆積量已經(jīng)超過物理內(nèi)存 40%時,則建議從從服務器拉取消息,否則還是從主服務器拉取消息;
如果 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); } }
當消費者收到拉取響應回來的數(shù)據(jù)后,會將下次建議拉取的 brokerID 緩存起來。下次拉取消息就會從 pullFromWhichNodeTable 中取出拉取 brokerId。
關于RocketMQ主從讀寫分離機制的原理是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)頁名稱:RocketMQ主從讀寫分離機制的原理是什么
分享網(wǎng)址:http://www.rwnh.cn/article10/ipjogo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、企業(yè)網(wǎng)站制作、網(wǎng)站導航、品牌網(wǎng)站設計、網(wǎng)站改版、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)