Nacos注冊中心客戶端容災

目前Nacos客戶端有一個FailoverReactor來進行容災文件的管理,可以通過在指定磁盤文件里寫入容災數據來進行客戶端使用數據的覆蓋。FailoverReactor目前會攔截Nacos客戶端查詢接口調用,以getAllInstances接口為例,目前FailoverReactor的工作流程如下圖:


這里主要涉及到兩個組件:

  • FailoverReactor:容災數據管理類,負責容災開關和數據的加載和刷新;
  • ServiceInfoHoler:默認的服務數據管理類,持有一份內存服務數據緩存,負責處理Nacos服務端的推送的最新數據;

FailoverReactor和ServiceInfoHoler的交互機制如下:

這里和客戶端容災的相關邏輯主要是3個:

  1. FailoverReactor會定期讀取磁盤容災開關文件;
  2. 當容災開關打開時,FailoverReactor會從磁盤里加載容災數據文件,同時用戶調用查詢請求時就會優先使用容災文件里的數據;
  3. FailoverReactor會定期從ServiceInfoHolder拿到最新的內存數據,保存到容災磁盤數據文件里;

目前的方式有四個問題:

  1. 無法人工覆蓋容災數據,當前是定期將ServiceInfoHolder里的數據進行持久化作為容災數據。即使手動修改了容災數據磁盤文件內容,也會被覆蓋為ServiceInfoHolder里的數據;
  2. 基于磁盤的容災緩存有一些限制,比如服務的訂閱者有多個機器實例時,如果需要打開容災開關,需要運維批量修改機器的文件;
  3. subscribe接口不會使用FailoverReactor里的數據;
  4. 容災數據的可觀測性也需要優化。

實現方案

上面提到的問題1、3和4都比較好解決,下面會一一闡述。針對問題2,一般在生產環境中,我們會考慮使用中心化的數據存儲來進行容災數據的存儲和管理。我們可以將FailoverReactor依賴的數據 來源抽象為一個SPI接口FailoverDataSource,這個接口默認實現還是本地磁盤,但是用戶可以實現這個SPI接口來使用自定義的容災數據源。

接口和數據結構定義

FailoverDataSource的定義為:

public interface FailoverDataSource {FailoverSwitch getSwitch();Map<String, FailoverData> getFailoverData();
}

各個方法的作用為:

  • FailoverSwitch getSwitch():獲取當前的容災開關;
  • Map<String, FailoverData> getFailoverData():獲取當前的容災數據,返回一個map,key是服務名,value為對應服務的容災數據;

FailoverSwitch的定義建議如下:

public class FailoverSwitch {private boolean enabled;
}
  • enabled:容災是否打開;

FailoverData的定義建議為:

public abstract class FailoverData {private DataType dataType;private Object data;protected FailoverData(Object data, DataType dataType) {this.data = data;this.dataType = dataType;}enum DataType {naming,config}
}
  • dataType:容災數據類型,這里因為需要綜合考慮配置模塊的容災,所以使用抽象類定義了naming和config兩種容災數據類型;
  • data:容災數據,子類設置具體類型;

以naming模塊為例,NamingFailoverData擴展FailoverData:

public class NamingFailoverData extends FailoverData {private NamingFailoverData(ServiceInfo serviceInfo) {super(serviceInfo, DataType.naming);}public static NamingFailoverData newNamingFailoverData(ServiceInfo serviceInfo) {return new NamingFailoverData(serviceInfo);}
}

NamingFailoverData里的容災數據類型為ServiceInfo。

交互流程

FailoverReactor內部流程

FailoverReactor和FailoverDataSource、ServiceInfoHoler的交互機制優化為:

各個組件職責說明如下:

  • FailoverReactor:存儲容災緩存數據,管理容災開關定時任務和容災數據更新定時任務;
  • FailoverSwitchRefresher:定時(每5秒)從容災數據源查詢容災開關,根據容災開關的值進行相應操作:
    • 若容災打開:從容災數據源查詢容災數據FailoverDataSource,保存到FailoverReactor的內存容災數據map里;
    • 若容災關閉:清空FailoverReactor的內存容災數據map;
  • FailoverDataSource:存儲容災數據,前文已經提及;
  • ServiceInfoHoler:默認情況下服務數據的管理,前文已經提及;

客戶端查詢請求流程

對于客戶端的查詢請求,其流程優化為:

這里的流程和之前的變化為:當從failoverReactor里拿不到容災數據的時候,還是會去serviceInfoHolder里讀取數據。這么做的目的是因為我們可能只配置部分服務進行容災,其他的服務還是走serviceInfoHolder。

訂閱接口事件通知流程

對于訂閱接口,之前是不會受到容災開關的影響,現在則也會在容災開啟時停止數據更新通知:

public ServiceInfo processServiceInfo(ServiceInfo serviceInfo) {...if (changed) {NAMING_LOGGER.info("current ips:({}) service: {} -> {}", serviceInfo.ipCount(), serviceInfo.getKey(),JacksonUtils.toJson(serviceInfo.getHosts()));// 判斷容災開關是否打開,打開時不發布事件:if (!failoverDataSource.getFailoverSwitch().isEnabled()) {NotifyCenter.publishEvent(new InstancesChangeEvent(notifierEventScope, serviceInfo.getName(), serviceInfo.getGroupName(),serviceInfo.getClusters(), serviceInfo.getHosts()));}DiskCache.write(serviceInfo, cacheDir);}return serviceInfo;}

同時,在容災關閉時,我們需要根據容災期間數據是否發生變化來決定要不要觸發訂閱事件通知,我們可以把這個邏輯駕到上面提到的FailoverSwitchRefresher里:

在這里當FailoverSwitchRefresher輪詢發現容災關閉時,在清空FailoverReactor的內存數據之前,會觸發FailoverReactor和ServiceInfoHolder的數據比較,如果發現數據不一致,則會觸發ServiceInfoHolder發布對應的服務變更事件。

可觀測性

我們可以定義個MultiGauge來存儲FailoverReactor里目前生效的容災數據內容,統計粒度為每個服務當前有多少個實例:

MultiGauge failoverInstanceCounts = MultiGauge.builder("nacos_naming_client_failover_instances").register(Metrics.globalRegistry);Set<String> serviceNames = failoverDataSource.getSwitch().getServiceNames();
Map<String, FailoverData> failoverDataMap = failoverDataSource.getFailoverData();failoverInstanceCounts.register(serviceNames.stream().map(serviceName -> MultiGauge.Row.of(Tags.of("service_name", serviceName), ((ServiceInfo)failoverDataMap.get(serviceName)).ipCount())).collect(Collectors.toList()), true);

測試用例

以下場景需要進行測試:

  • 打開容災開關后,對于包含在容災的服務列表里的服務,Nacos服務端數據變化不影響客戶端查詢和訂閱;
  • 關閉容災開關后,對于所有服務客戶端查詢到最新數據;
  • 關閉容災開關后,若訂閱的服務數據在容災期間有變化,會觸發一次訂閱通知;
  • 設置容災的服務列表,不在服務列表里的不會使用容災數據;
  • 使用自定義的容災實現,可以被加載并運行;

原文出自:Nacos官網?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212584.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【合集】SpringBoot——Spring,SpringBoot,SpringCloud相關的博客文章合集

前言 本篇博客是spring相關的博客文章合集&#xff0c;內容涵蓋Spring&#xff0c;SpringBoot&#xff0c;SpringCloud相關的知識&#xff0c;包括了基礎的內容&#xff0c;比如核心容器&#xff0c;springMVC&#xff0c;Data Access&#xff1b;也包括Spring進階的相關知識&…

免費的網頁數據抓取工具有哪些?【2024附下載鏈接】

在網絡上&#xff0c;有許多網頁數據抓取工具可供選擇。本文將探討其如何全網采集數據并支持指定網站抓取。我們將比較不同的數據采集工具&#xff0c;幫助您找到最適合您需求的工具。 網頁數據抓取工具種類 在選擇網頁數據抓取工具之前&#xff0c;讓我們先了解一下這些工具…

TC397 EB MCAL開發從0開始系列 之 [21.2] FlsLoader配置實戰 - 擦除讀寫Pflash

一、FlsLoader配置1、配置目標2、目標依賴2.1 硬件使用2.2 軟件使用2.3 新增模塊3、EB配置3.1 配置講解3.2 模塊配置3.2.1 MCU配置3.2.2 PORT配置3.2.3 FlsLoader配置3.2.5 Irq配置3.2.6 ResourceM配置4、ADS代碼編寫及調試<

[ 藍橋杯Web真題 ]-布局切換

目錄 介紹 準備 目標 規定 思路 解法參考 介紹 經常用手機購物的同學或許見過這種功能&#xff0c;在瀏覽商品列表的時候&#xff0c;我們通過點擊一個小小的按鈕圖標&#xff0c;就能快速將數據列表在大圖&#xff08;通常是兩列&#xff09;和列表兩種布局間來回切換。…

電機:有刷直流電機的原理

一、什么是有刷直流電機 直流有刷電機&#xff08;Brushed DC Motor&#xff09;&#xff0c;定子是用永磁鐵或者線圈做成&#xff0c;以形成固定磁場。在定子一端上有固定碳刷&#xff0c;或者銅刷&#xff0c;負責把外部電流引入轉子線圈。而轉子是由線圈構成&#xff0c;線…

郵件營銷軟件:10個創新郵件營銷策略,提升投資回報率(一)

電子商務和電子郵件營銷密不可分。盡管電子商務在蓬勃發展&#xff0c;而很多人對郵件營銷頗有微詞。但是在電子商務中&#xff0c;郵件營銷的確是一種有效營銷方式。在本文中&#xff0c;我們將討論一下郵件營銷在電子商務中的有效運用&#xff0c;幫助您的企業在今年盡可能地…

2023-12-05 Qt學習總結6

點擊 <C 語言編程核心突破> 快速C語言入門 Qt學習總結 前言十八 QMessageBox消息對話框十九 Qt布局管理總結 前言 要解決問題: 學習qt最核心知識, 多一個都不學. 十八 QMessageBox消息對話框 QMessageBox消息對話框是Qt中的一個提供用戶交互界面的對話框窗口。 它通常…

MyBatis 四大核心組件之 ParameterHandler 源碼解析

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 倉庫主頁&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 歡迎點贊…

【圖片版】計算機組成原理考前復習題【第2章 運算方法和運算器-1】

目錄 前言 考前復習題&#xff08;必記&#xff09; 結尾 前言 在計算機組成原理的學習過程中&#xff0c;我們深入探索了計算機系統概述這一重要領域。計算機系統作為現代科技的核心&#xff0c;是整個計算機科學的基石。我們將學到的知識與理論轉化為了能夠解決現實問題的…

Python+unittest+requests接口自動化測試框架搭建 完整的框架搭建過程

首先配置好開發環境&#xff0c;下載安裝Python并下載安裝pycharm&#xff0c;在pycharm中創建項目功能目錄。如果不會的可以百度Google一下&#xff0c;該內容網上的講解還是比較多比較全的&#xff01; 大家可以先簡單了解下該項目的目錄結構介紹&#xff0c;后面會針對每個文…

docker 可視化工具操作說明 portainer

官網地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下載并安裝容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

PWN動態調試

這篇文章就是來教大家學習怎么動態調試的&#xff0c;然后我還寫了一篇關于動態調試的文章&#xff0c;不是buu上面的題&#xff0c;就是兩道簡單的棧溢出問題&#xff0c;那兩道題挺有特點的。大家可以去看看。 每日3道PWN之課外2道&#xff08;第2.5天&#xff09;-CSDN博客 …

C#暫停和恢復(Thread.Suspend()和Thread.Resume() vs AutoResetEvent()和EventWaitHandle())

目錄 一、Thread.Suspend()和Thread.Resume() 二、AutoResetEvent()和EventWaitHandle() 1.AutoResetEvent() 2.EventWaitHandle() 3.示例及生成效果 一、Thread.Suspend()和Thread.Resume() 自 .NET 2.0 以后&#xff08;含&#xff09;&#xff0c;Thread.Suspend() 和…

性能監控體系:InfluxDB Grafana Prometheus

InfluxDB 簡介 什么是 InfluxDB &#xff1f; InfluxDB 是一個由 InfluxData 開發的&#xff0c;開源的時序型數據庫。它由 Go 語言寫成&#xff0c;著力于高性能地查詢與存儲時序型數據。 InfluxDB 被廣泛應用于存儲系統的監控數據、IoT 行業的實時數據等場景。 可配合 Te…

SSD基礎架構與NAND IO并發問題探討

在我們的日常生活中&#xff0c;我們經常會遇到一些“快如閃電”的事物&#xff1a;比如那場突如其來的雨、那個突然出現在你眼前的前任、還有就是今天我們要聊的——固態硬盤&#xff08;SSD&#xff09;。 如果你是一個技術宅&#xff0c;或者對速度有著近乎偏執的追求&…

電阻知識總結與詳細選型指南

目錄 1. 基礎知識 1.1 電阻的定義和符號 1.2 電阻的公式 1.3 電阻的串聯與并聯 2. 參數選型 2.1 電阻值 2.2 功率 2.3 精度 2.4 溫度系數 2.5 電壓系數 2.6 包裝類型 2.7 耐壓 2.8 特殊應用需求 2.9 環保要求 3. 產品應用 3.1 電流限制和保護 3.2 電壓分壓和電…

【Qt開發流程】之容器類1:介紹及常用容器類和使用Java風格迭代器進行遍歷

概述 Qt庫提供了一組通用的基于模板的容器類。這些類可用于存儲指定類型的項。例如&#xff0c;如果需要一個可調整大小的QString數組&#xff0c;可以使用QVector<QString>。 這些容器類被設計成比STL容器更輕、更安全、更易于使用。如果不熟悉STL&#xff0c;或者更喜…

低多邊形3D建模石頭材質紋理貼圖

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

云計算在計算機領域的應用與發展

云計算在計算機領域的應用與發展 一、引言 隨著科技的不斷發展&#xff0c;計算機領域已經成為當今社會最為活躍和創新的領域之一。云計算作為一種新興的計算模式&#xff0c;已經在計算機領域中得到了廣泛的應用&#xff0c;并且正在不斷地推動著計算機領域的發展。本文將探…

Ultimate VFX

Ultimate VFX 構建套件: