Skip to content

Latest commit

 

History

History
57 lines (39 loc) · 2.93 KB

strict_cost_partitioner.md

File metadata and controls

57 lines (39 loc) · 2.93 KB

Strict Cost Partitioner

Strict Cost Partitioner 是 Astraea partitioner 之一,功能在於 "依據 broker cost" 來選擇發送的 partition 順序。"broker cost" 是使用者自定義的效能指標,目前使用 "request 平均延遲" 作為效能指標。(TODO: 允許使用者選擇效能指標)

於本專案的 performance tool 使用

$ ./docker/start_app.sh performance --bootstrap.servers 192.168.103.26:9092 --partitioner org.astraea.common.partitioner.StrictCostPartitioner

(加入參數 "--partitioner org.astraea.app.partitioner.StrictCostPartitioner" 即可選定使用 Strict Cost Partitioner 作為 partitioner )

導入自己的程式

需在創建 Kafka Producer 時設定使用 StrictCostPartitioner

var props = new Properties();

/* ... Some Kafka properties to put into ...*/

props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "org.astraea.common.partitioner.StrictCostPartitioner");

var producer = new KafkaProducer<String, String>(props);

功能說明

Strict Cost Partitioner 實做了 Apache Kafka 的 org.apache.kafka.clients.producer.Partitioner 介面,當 record 沒有指定要發送到哪個 partition 時,producer 便會呼叫 partitioner 來決定要把 record 發送到哪個 partition 上?

此 Partitioner (or called partitioner) 便藉著 Apache Kafka 提供的這項自由度,來選擇 "適合" 的 partition 發送。Strict Cost Partitioner 在選擇 partition 前,會

  1. 獲取使用者定義的效能指標(預設是使用 producer 端的 request 平均延遲),下方範例示範指定以record大小為成本估計:
var props = new Properties();
props.put("partitioner.class", "org.astraea.common.partitioner.StrictCostPartitioner");
props.put("partitioner.cost.org.astraea.common.cost.RecordSizeCost", "1");
var producer = new KafkaProducer<String, String>(props);
  1. 使用該些效能指標計算各個 broker 的分數
  2. 加權各個效能指標計算出的分數
  3. 利用分數建立 Smooth Round Robin 的排序
  4. 紀錄前 ROUND_ROBIN_LENGTH 筆排序並重複使用

以上5個步驟每 round.robin.lease 時間會重新計算一次,預設的時間是4秒。可以在傳入的 Properties 中設定,

# 使用 performance tool 時,設定更新效能指標的時間
$ ./docker/start_app.sh performance --bootstrap.servers 192.168.103.26:9092 --partitioner org.astraea.common.partitioner.StrictCostPartitioner --configs
// 為 StrictCostPartitioner 設定更新效能使標的時間
props.put(StrictCostPartitioner.ROUND_ROBIN_LEASE_KEY, "10s");

Smooth Round Robin 會讓分數較高的節點有較高的出現頻率,但不會過於密集,讓我們在平衡負載的同時也顧及資料分散儲存處理。