Dubbo3 應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)地址遷移規(guī)則說明

2022-04-12 13:44 更新

本文具體說明了地址遷移過程中使用的規(guī)則體信息,用戶可以根據(jù)自己需求定制適合自己的遷移規(guī)則。

狀態(tài)模型

在 Dubbo 3 之前地址注冊(cè)模型是以接口級(jí)粒度注冊(cè)到注冊(cè)中心的,而 Dubbo 3 全新的應(yīng)用級(jí)注冊(cè)模型注冊(cè)到注冊(cè)中心的粒度是應(yīng)用級(jí)的。從注冊(cè)中心的實(shí)現(xiàn)上來說是幾乎不一樣的,這導(dǎo)致了對(duì)于從接口級(jí)注冊(cè)模型獲取到的 invokers 是無法與從應(yīng)用級(jí)注冊(cè)模型獲取到的 invokers 進(jìn)行合并的。為了幫助用戶從接口級(jí)往應(yīng)用級(jí)遷移,Dubbo 3 設(shè)計(jì)了 Migration 機(jī)制,基于三個(gè)狀態(tài)的切換實(shí)現(xiàn)實(shí)際調(diào)用中地址模型的切換。

http://imgs/v3/migration/migration-1.png

當(dāng)前共存在三種狀態(tài),F(xiàn)ORCE_INTERFACE(強(qiáng)制接口級(jí)),APPLICATION_FIRST(應(yīng)用級(jí)優(yōu)先)、FORCE_APPLICATION(強(qiáng)制應(yīng)用級(jí))。

FORCE_INTERFACE:只啟用兼容模式下接口級(jí)服務(wù)發(fā)現(xiàn)的注冊(cè)中心邏輯,調(diào)用流量 100% 走原有流程 APPLICATION_FIRST:開啟接口級(jí)、應(yīng)用級(jí)雙訂閱,運(yùn)行時(shí)根據(jù)閾值和灰度流量比例動(dòng)態(tài)決定調(diào)用流量走向 FORCE_APPLICATION:只啟用新模式下應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)的注冊(cè)中心邏輯,調(diào)用流量 100% 走應(yīng)用級(jí)訂閱的地址

規(guī)則體說明

規(guī)則采用 yaml 格式配置,具體配置下參考如下:

key: 消費(fèi)者應(yīng)用名(必填)
step: 狀態(tài)名(必填)
threshold: 決策閾值(默認(rèn)1.0)
proportion: 灰度比例(默認(rèn)100)
delay: 延遲決策時(shí)間(默認(rèn)0)
force: 強(qiáng)制切換(默認(rèn) false)
interfaces: 接口粒度配置(可選)
  - serviceKey: 接口名(接口 + : + 版本號(hào))(必填)
    threshold: 決策閾值
    proportion: 灰度比例
    delay: 延遲決策時(shí)間
    force: 強(qiáng)制切換
    step: 狀態(tài)名(必填)
  - serviceKey: 接口名(接口 + : + 版本號(hào))
    step: 狀態(tài)名
applications: 應(yīng)用粒度配置(可選)
  - serviceKey: 應(yīng)用名(消費(fèi)的上游應(yīng)用名)(必填)
    threshold: 決策閾值
    proportion: 灰度比例
    delay: 延遲決策時(shí)間
    force: 強(qiáng)制切換
    step: 狀態(tài)名(必填)
  • key: 消費(fèi)者應(yīng)用名
  • step: 狀態(tài)名(FORCE_INTERFACE、APPLICATION_FIRST、FORCE_APPLICATION)
  • threshold: 決策閾值(浮點(diǎn)數(shù),具體含義參考后文)
  • proportion: 灰度比例(0~100,決定調(diào)用次數(shù)比例)
  • delay: 延遲決策時(shí)間(延遲決策的時(shí)間,實(shí)際等待時(shí)間為 1~2 倍 delay 時(shí)間,取決于注冊(cè)中心第一次通知的時(shí)間,對(duì)于目前 Dubbo 的注冊(cè)中心實(shí)現(xiàn)次配置項(xiàng)保留 0 即可)
  • force: 強(qiáng)制切換(對(duì)于 FORCE_INTERFACE、FORCE_APPLICATION 是否不考慮決策直接切換,可能導(dǎo)致無地址調(diào)用失敗問題)
  • interfaces: 接口粒度配置

參考配置示例如下:

key: demo-consumer
step: APPLICATION_FIRST
threshold: 1.0
proportion: 60
delay: 0
force: false
interfaces:
  - serviceKey: DemoService:1.0.0
    threshold: 0.5
    proportion: 30
    delay: 0
    force: true
    step: APPLICATION_FIRST
  - serviceKey: GreetingService:1.0.0
    step: FORCE_APPLICATION

配置方式說明

1. 配置中心配置文件下發(fā)(推薦)

  • Key: 消費(fèi)者應(yīng)用名 + “.migration”
  • Group: DUBBO_SERVICEDISCOVERY_MIGRATION

? 配置項(xiàng)內(nèi)容參考上一節(jié)

程序啟動(dòng)時(shí)會(huì)拉取此配置作為最高優(yōu)先級(jí)啟動(dòng)項(xiàng),當(dāng)配置項(xiàng)為啟動(dòng)項(xiàng)時(shí)不執(zhí)行檢查操作,直接按狀態(tài)信息達(dá)到終態(tài)。 程序運(yùn)行過程中收到新配置項(xiàng)將執(zhí)行遷移操作,過程中根據(jù)配置信息進(jìn)行檢查,如果檢查失敗將回滾為遷移前狀態(tài)。遷移是按接口粒度執(zhí)行的,也即是如果一個(gè)應(yīng)用有 10 個(gè)接口,其中 8 個(gè)遷移成功,2 個(gè)失敗,那終態(tài) 8 個(gè)遷移成功的接口將執(zhí)行新的行為,2 個(gè)失敗的仍為舊狀態(tài)。如果需要重新觸發(fā)遷移可以通過重新下發(fā)規(guī)則達(dá)到。

注:如果程序在遷移時(shí)由于檢查失敗回滾了,由于程序無回寫配置項(xiàng)行為,所以如果此時(shí)程序重啟了,那么程序會(huì)直接按照新的行為不檢查直接初始化。

2. 啟動(dòng)參數(shù)配置

  • 配置項(xiàng)名:dubbo.application.service-discovery.migration
  • 允許值范圍:FORCE_INTERFACE、APPLICATION_FIRST、FORCE_APPLICATION

此配置項(xiàng)可以通過環(huán)境變量或者配置中心傳入,啟動(dòng)時(shí)優(yōu)先級(jí)比配置文件低,也即是當(dāng)配置中心的配置文件不存在時(shí)讀取此配置項(xiàng)作為啟動(dòng)狀態(tài)。

3. 本地文件配置

配置項(xiàng)名 默認(rèn)值 說明
dubbo.migration.file dubbo-migration.yaml 本地配置文件路徑
dubbo.application.migration.delay 60000 配置文件延遲生效時(shí)間(毫秒)

配置文件中格式與前文提到的規(guī)則一致

本地文件配置方式本質(zhì)上是一個(gè)延時(shí)配置通知的方式,本地文件不會(huì)影響默認(rèn)啟動(dòng)方式,當(dāng)達(dá)到延時(shí)時(shí)間后觸發(fā)推送一條內(nèi)容和本地文件一致的通知。這里的延時(shí)時(shí)間與規(guī)則體中的 delay 字段無關(guān)聯(lián)。 本地文件配置方式可以保證啟動(dòng)以默認(rèn)行為初始化,當(dāng)達(dá)到延時(shí)時(shí)觸發(fā)遷移操作,執(zhí)行對(duì)應(yīng)的檢查,避免啟動(dòng)時(shí)就以終態(tài)方式啟動(dòng)。

決策說明

1. 閾值探測

閾值機(jī)制旨在進(jìn)行流量切換前的地址數(shù)檢查,如果應(yīng)用級(jí)的可使用地址數(shù)與接口級(jí)的可用地址數(shù)對(duì)比后沒達(dá)到閾值將檢查失敗。

核心代碼如下:

if (((float) newAddressSize / (float) oldAddressSize) >= threshold) {
    return true;
}
return false;

同時(shí) MigrationAddressComparator 也是一個(gè) SPI 拓展點(diǎn),用戶可以自行拓展,所有檢查的結(jié)果取交集。

2. 灰度比例

灰度比例功能僅在應(yīng)用級(jí)優(yōu)先狀態(tài)下生效。此功能可以讓用戶自行決定調(diào)用往新模式應(yīng)用級(jí)注冊(cè)中心地址的調(diào)用數(shù)比例?;叶壬У那疤崾菨M足了閾值探測,在應(yīng)用級(jí)優(yōu)先狀態(tài)下,如果閾值探測通過,currentAvailableInvoker 將被切換為對(duì)應(yīng)應(yīng)用級(jí)地址的 invoker;如果探測失敗 currentAvailableInvoker 仍為原有接口級(jí)地址的 invoker。

流程圖如下: 探測階段  http://imgs/v3/migration/migration-2.png 調(diào)用階段  http://imgs/v3/migration/migration-3.png

核心代碼如下:

// currentAvailableInvoker is based on MigrationAddressComparator's result
if (currentAvailableInvoker != null) {
    if (step == APPLICATION_FIRST) {
        // call ratio calculation based on random value
        if (ThreadLocalRandom.current().nextDouble(100) > promotion) {
            return invoker.invoke(invocation);
        }
    }
    return currentAvailableInvoker.invoke(invocation);
}

切換過程說明

地址遷移過程中涉及到了三種狀態(tài)的切換,為了保證平滑遷移,共有 6 條切換路徑需要支持,可以總結(jié)為從強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)往應(yīng)用級(jí)優(yōu)先切換;應(yīng)用級(jí)優(yōu)先往強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)切換;還有強(qiáng)制接口級(jí)和強(qiáng)制應(yīng)用級(jí)互相切換。 對(duì)于同一接口切換的過程總是同步的,如果前一個(gè)規(guī)則還未處理完就收到新規(guī)則則回進(jìn)行等待。

1. 切換到應(yīng)用級(jí)優(yōu)先

從強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)往應(yīng)用級(jí)優(yōu)先切換本質(zhì)上是從某一單訂閱往雙訂閱切換,保留原有的訂閱并創(chuàng)建另外一種訂閱的過程。這個(gè)切換模式下規(guī)則體中配置的 delay 配置不會(huì)生效,也即是創(chuàng)建完訂閱后馬上進(jìn)行閾值探測并決策選擇某一組訂閱進(jìn)行實(shí)際優(yōu)先調(diào)用。由于應(yīng)用級(jí)優(yōu)先模式是支持運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行閾值探測,所以對(duì)于部分注冊(cè)中心無法啟動(dòng)時(shí)即獲取全量地址的場景在全部地址通知完也會(huì)重新計(jì)算閾值并切換。 應(yīng)用級(jí)優(yōu)先模式下的動(dòng)態(tài)切換是基于服務(wù)目錄(Directory)的地址監(jiān)聽器實(shí)現(xiàn)的。  http://imgs/v3/migration/migration-4.png

2. 應(yīng)用級(jí)優(yōu)先切換到強(qiáng)制

應(yīng)用級(jí)優(yōu)先往強(qiáng)制接口級(jí)、強(qiáng)制應(yīng)用級(jí)切換的過程是對(duì)雙訂閱的地址進(jìn)行檢查,如果滿足則對(duì)另外一份訂閱進(jìn)行銷毀,如果不滿足則回滾保留原來的應(yīng)用級(jí)優(yōu)先狀態(tài)。 如果用戶希望這個(gè)切換過程不經(jīng)過檢查直接切換可以通過配置 force 參數(shù)實(shí)現(xiàn)。  http://imgs/v3/migration/migration-5.png

3. 強(qiáng)制接口級(jí)和強(qiáng)制應(yīng)用級(jí)互相切換

強(qiáng)制接口級(jí)和強(qiáng)制應(yīng)用級(jí)互相切換需要臨時(shí)創(chuàng)建一份新的訂閱,判斷新的訂閱(即閾值計(jì)算時(shí)使用新訂閱的地址數(shù)去除舊訂閱的地址數(shù))是否達(dá)標(biāo),如果達(dá)標(biāo)則進(jìn)行切換,如果不達(dá)標(biāo)會(huì)銷毀這份新的訂閱并且回滾到之前的狀態(tài)。  http://imgs/v3/migration/migration-6.png



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)