[zebra源碼]GroupDataSource配置變更實(shí)時(shí)生效

在初始化 GroupDataSource 的時(shí)候,會(huì)往它的配置管理器 DefaultDataSourceConfigManager中添加了一個(gè)配置監(jiān)聽(tīng)器

代碼路徑:GroupDataSource#init() -> initConfig();

this.dataSourceConfigManager.addListerner(new GroupDataSourceConfigChangedListener());
    public class GroupDataSourceConfigChangedListener implements PropertyChangeListener {
        @Override
        public synchronized void propertyChange(PropertyChangeEvent evt) {
            **refresh**(evt.getPropertyName());
        }
}

在監(jiān)聽(tīng)到配置變更(zk或http)的時(shí)候,會(huì)調(diào)用分組ds內(nèi)部的 GroupDataSource#refresh 方法進(jìn)行刷新

image.png

#refreshInternal

參考 分組GroupDataSource及其初始化 中初始化的寫庫(kù)和讀庫(kù)的 ds 類型

  1. 刷新寫庫(kù) writeDataSource#refresh (FailOverDataSource#refresh) 篩選配置中的第一個(gè)寫庫(kù),新建SingleDataSource 替換掉老的,然后銷毀老的sds
  2. 刷新讀庫(kù) readDataSource#refresh (LoadBalanceDataSource#refresh)
  3. 篩選配置中的所有讀庫(kù),新建SingleDataSource 替換掉老的,然后銷毀老的sds

一般是直接重建底層 DataSource連接池 ,不然要根據(jù)底層數(shù)據(jù)庫(kù)連接池的支持情況來(lái) 更新單個(gè)屬性,這樣適配起來(lái)就會(huì)非常的繁瑣, 而這種db配置變更本身是非常低頻或者在故障的時(shí)候急救措施, 重建 DataSource 期間少許的報(bào)錯(cuò)也可以接受

除了這個(gè)實(shí)時(shí)的配置更新之外,還有一個(gè) DataSourceConfigRefresh 每隔1分鐘,檢查一次group分組和分組內(nèi)single的配置是否發(fā)生變化; 這樣就避免了 配置更新的時(shí)候由于網(wǎng)絡(luò)異常等原因 數(shù)據(jù)源刷新失敗

zebra 只支持整個(gè)GroupDataSource 粒度的配置刷新,沒(méi)有單獨(dú)刷新 SingleDataSource配置, 不能單獨(dú)調(diào)整連接池的配置
如果讀寫分離中其中一個(gè)db節(jié)點(diǎn)故障,要切換成備份節(jié)點(diǎn),這個(gè)時(shí)候 zebra就只能整體變動(dòng)整個(gè)Group分組,切換會(huì)比較費(fèi)時(shí); 個(gè)人覺(jué)得還是需要支持單個(gè) db節(jié)點(diǎn)(SingleDataSouce)的配置變更,方便故障切換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容