Allow to bypass the dynamic bandwidth estimation in NetworkCost
#1839
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
有一種比較 Balancer 實作的方法是給定好一個叢集的 topic/partition/replica 配置,還有預先指定好每個 topic/partition 的各項開銷,然後營造出 Balancer 上述對應的輸入下去測演算法出來的結果,這種實驗手法很重要,他能夠讓我們比較不同品牌的 Balancer 實作,如 Cruise Control。目前的
NetworkCost
實作很難簡單地做到粗體那段,這個 PR 在讓粗體那段簡單一點,進而更好做上述的實驗。目前
NetworkCost#clusterCost
函數會接受兩個參數:ClusterInfo
和ClusterBean
,從兩個資訊去判斷叢集的網路負載平衡狀況,這個過程中函數會從ClusterBean
中的 JMX MBeans 去推斷每個 Partition 對應的讀取/寫入流量,這個過程在原始碼中是稱作 bandwidth estimation。bandwidth estimation 是一個很複雜的過程,他通常會需要從很大大量的 metrics 去判斷/過濾/檢查輸入的 metrics 是否正確 or 對應的 topic/partition 開銷是多少,這個過程在生產環境的真實實驗中是非常必須且重要的,如 #1641 所述,metrics 的內容可能會不穩定或蒐集不完全,因此實務上有必要做這一段事情。但由於 bandwidth estimation 的流程,導致第一段的實驗步驟很難在目前的
NetworkCost
實作下很難做到,實驗實作必須要把topic-1 = 1000
,topic-2 = 1024
, ... 這個單純的訊息壓成一個ClusterBean
,然後由於 bandwidth estimation 本身的複雜度,這個ClusterBean
可能會包含五花八門的 metrics,比如目前NetworkCost
會蒐集下面這些 metricshttps://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/main/java/org/astraea/common/cost/NetworkCost.java#L193-L206
上述六個 metrics 中只有兩個和流量有關,剩下四個都在除錯或嘗試逆推叢集的狀態。
下面這兩段程式碼示範從流量 Map 到
ClusterBean
的實作複雜程度。https://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/test/java/org/astraea/common/cost/NetworkCostTest.java#L643-L648
https://github.com/skiptests/astraea/blob/084c9d643471d18750759ca241c5c38c269b0f67/common/src/test/java/org/astraea/common/cost/NetworkCostTest.java#L655-L743
PR 的修正
新增
NetworkCost#setCalculation
函數,這個函數允許我們直接指定ClusterBean
對應的 Partition 負載,進而繞過上述的 bandwidth estimation 過程,直接插入一個我們確定沒有問題的值。我覺得更好的修正是把 Bandwidth Estimation 這段做成一個 interface (sealed maybe),然後第一段的實驗程式碼可以直接插入一個 estimation implementation 是總是回傳給定的 topic/partition 負載量,不過這樣做會需要做比較大幅度的更改