opensource4you / astraea

釋放kafka的無限潛能
Apache License 2.0
125 stars 45 forks source link

[WIP] Refactor NodeMetricsCost#brokerCost #1818

Closed brandboat closed 1 year ago

brandboat commented 1 year ago

resolve #1601

chia7712 commented 1 year ago

@brandboat 可否看一下測試是否跟此PR有關?如果無關的話請幫忙開 issue 追蹤一下

brandboat commented 1 year ago

可否看一下測試是否跟此PR有關?如果無關的話請幫忙開 issue 追蹤一下

有關,正在想要怎麼解決~

brandboat commented 1 year ago

@chia7712 不好意思我這邊遇到一些困難想請教,目前實作上碰到一些測試錯誤,像是:

NodeLatencyCostTest#testBrokerId 是確保 ClusterInfo 為空且 ClusterBean brokerIds 為 -1 的狀況下仍然可以正常取得到 ClusterBean 中所有的 bean 裡頭的 brokerId。要做到這件事在不改動 ClusterBean 裡頭實作下,在 NodeMetricsCost#brokerCost 只能繼續使用原來的方法,也就是 groupingBy bean 裡頭的 brokerId,因ClusterBean#brokerIds 目前是直接回傳傳入的 map 的 keyset,也就是 List.of(-1),不確定我是否理解有誤,感謝

chia7712 commented 1 year ago

NodeLatencyCostTest#testBrokerId 是確保 ClusterInfo 為空且 ClusterBean brokerIds 為 -1 的狀況下仍然可以正常取得到 ClusterBean 中所有的 bean 裡頭的 brokerId。要做到這件事在不改動 ClusterBean 裡頭實作下,在 NodeMetricsCost#brokerCost 只能繼續使用原來的方法,也就是 groupingBy bean 裡頭的 brokerId,因ClusterBean#brokerIds 目前是直接回傳傳入的 map 的 keyset,也就是 List.of(-1),不確定我是否理解有誤,感謝

那隻測試的情境是說 當某個節點沒有對應的 metrics 時 (也就是該節點的 broker id 不存在),NodeLatencyCost預設會將該節點的成本值設定與最高成本的節點一樣

brandboat commented 1 year ago

那隻測試的情境是說 當某個節點沒有對應的 metrics 時 (也就是該節點的 broker id 不存在),NodeLatencyCost預設會將該節點的成本值設定與最高成本的節點一樣

我想測試中的 -1 指得就是不存在的節點?但這樣為何會有節點擁有其他節點的 metrics 呢? 查了一下 -1 應該指的是從 bootstrap.server 取得的 node id,只是 kafka metrics 會用負數表示

chia7712 commented 1 year ago

查了一下 -1 應該指的是從 bootstrap.server 取得的 node id,只是 kafka metrics 會用負數表示

-1 是預設的 node id,並不代表不存在。測試應該只是隨意選了一個數字,然後給該數字一個metrics,然後看看其他不存在metrics的節點會否拿到一樣的數字(也就是最高的數值)

brandboat commented 1 year ago

不好意思想釐清一些概念,我原先以為 ClusterBean.all 的結構中 key 會與 value 中 Collection<HasBeanObject> HasBeanObject 所帶有的 node-id 一致,但實際跑了一些測試發現好像並非這樣,以 NodeLatencyCostTest 中來看,https://github.com/skiptests/astraea/blob/cdde1b0cf4397b3482a2a1bb809e0d71803609a5/common/src/test/java/org/astraea/common/cost/NodeLatencyCostTest.java#L87-L95 ProducerMetrics.node 所回傳的 Collection 中 HasBeenObject 就有包含非 -1 的 node-id。

另外在 StrictCostPartitonerPerfTest#test 中也有同樣現象,-1 的key 裡頭有node id 非 -1 的 beans https://github.com/skiptests/astraea/blob/cdde1b0cf4397b3482a2a1bb809e0d71803609a5/common/src/test/java/org/astraea/common/partitioner/StrictCostPartitionerPerfTest.java#L97-L103

chia7712 commented 1 year ago

不好意思想釐清一些概念,我原先以為 ClusterBean.all 的結構中 key 會與 value 中 Collection HasBeanObject 所帶有的 node-id 一致,但實際跑了一些測試發現好像並非這樣,以 NodeLatencyCostTest 中來看,

歹勢,今天通話時是我講錯觀念,現在的實作中 https://github.com/skiptests/astraea/blob/main/common/src/main/java/org/astraea/common/metrics/collector/MetricStore.java#L271 保存 all beans (map) 是單純以 BeanObject 從哪個 node 拉回來做分類,以ProducerMetrics#node來說,它回傳的 beans 的確會含有 node id,但是MetricStore不會參考該 node id,而是根據傳入的BeanObjectClient ID 做分群而已

brandboat commented 1 year ago

了解,我有另一件事很納悶,究竟傳到 brokerCost 中的 ClusterBean 裡頭會不會有多個 key ? 有的話這樣計算出來的結果是代表什麼物理意義?

以 NodeLatencyCost 為例,如果只有一個 key 我是理解成要找到該 key (節點) 到其他節點的平均延遲時間,但如果是多個 key,那我就有點難想像這究竟是什麼了

chia7712 commented 1 year ago

究竟傳到 brokerCost 中的 ClusterBean 裡頭會不會有多個 key ? 有的話這樣計算出來的結果是代表什麼物理意義?

多個 key 是指多個 node id 嗎?

如果只有一個 key 我是理解成要找到該 key (節點) 到其他節點的平均延遲時間,但如果是多個 key,那我就有點難想像這究竟是什麼了

假如你指得是多個 node id的話,BrokerCost#value的物理意義是該"node"的成本,數字越高越糟糕,所以如果是多個 key (node id)就是代表那些節點目前的成本值

brandboat commented 1 year ago

多個 key 是指多個 node id 嗎?

我指的像是 ClusterBean.of(Map.of(1, Collection<HasBeanObject>, 2, Collection<HasBeanObject>)) ,會不會有這種狀況,有 1 以及 2 這兩個 key 甚至多個

brandboat commented 1 year ago

不過這樣聽起來,我們是想要計算各個 node-id (也就是HasNodeMetric#brokerId) 的 cost,而非 BeanObjectClient ID 的 cost,這樣是不是就不能仰賴 clusterBean.brokerIds(),因為他回傳的是 BeanObjectClient ID。

chia7712 commented 1 year ago

我指的像是 ClusterBean.of(Map.of(1, Collection, 2, Collection)) ,會不會有這種狀況,有 1 以及 2 這兩個 key 甚至多個

會!就是從不同節點拉回來的metrics

chia7712 commented 1 year ago

不過這樣聽起來,我們是想要計算各個 node-id (也就是HasNodeMetric#brokerId) 的 cost,而非 BeanObjectClient ID 的 cost,這樣是不是就不能仰賴 clusterBean.brokerIds(),因為他回傳的是 BeanObjectClient ID。

以這隻 cost function 來說,的確是要看 HasNodeMetrics 裡面的 broker id

如果我開的議題邏輯有誤,可以直接指出喔

brandboat commented 1 year ago

以這隻 cost function 來說,的確是要看 HasNodeMetrics 裡面的 broker id

這樣的話,就不能用 ClusterBean#brokerIds 搭配 ClusterBean#brokerMetrics 這個舒服的寫法了,邏輯會跟原本的做法有出入,ClusterBean 是根據 BeanObjectClient ID 做聚合,而非 HasNodeMetrics 裡面的 broker id。

chia7712 commented 1 year ago

這樣的話,就不能用 ClusterBean#brokerIds 搭配 ClusterBean#brokerMetrics 這個舒服的寫法了,邏輯會跟原本的做法有出入,ClusterBean 是根據 BeanObjectClient ID 做聚合,而非 HasNodeMetrics 裡面的 broker id。

ok 那應該是我有誤解,麻煩在原本的議題說明一下然後關閉 謝謝