Skip to content
ADP
API Design PrincipleBETA

[ADP-609] 事件分區

概述

本 ADP 定義了使用 CloudEvents 分區擴展來實現事件分區的標準方法,並討論了在 Kafka 等消息中間件中的應用。

指導原則

  1. 必須(MUST)使用 CloudEvents 分區擴展來實現事件分區。

  2. 事件生產者必須(MUST)為需要分區的事件設置 partitionkey 屬性。

  3. partitionkey 屬性必須(MUST)是非空字串。

  4. 系統設計者應該(SHOULD)謹慎選擇分區鍵,以確保負載均衡和相關事件的正確分組。

  5. 事件消費者應該(SHOULD)能夠處理基於分區的事件流。

CloudEvents 分區擴展

分區擴展為 CloudEvents 添加了一個屬性:

  • partitionkey: 用於事件分區的鍵,通常用於定義多個事件之間的因果關係或分組。

示例 CloudEvent:

json
{
    "specversion" : "1.0",
    "type" : "com.example.someevent",
    "source" : "/mycontext",
    "id" : "C234-1234-1234",
    "time" : "2023-06-01T10:30:00Z",
    "partitionkey": "user-123",
    "data" : {
        "message" : "This event is partitioned"
    }
}

Kafka 中的應用

Kafka 是一個廣泛使用的分散式事件流平台,它原生支持事件分區:

  1. Kafka 使用主題(Topic)來組織事件流,每個主題可以有多個分區(Partition)。

  2. 當發送事件到 Kafka 時,可以使用 CloudEvents 的 partitionkey 作為 Kafka 的分區鍵。

  3. Kafka 會使用分區鍵的雜湊值來決定事件應該被寫入哪個分區。

  4. 具有相同 partitionkey 的事件將被寫入同一個分區,確保順序處理。

實施建議

  1. 選擇適當的分區策略,考慮負載均衡和事件順序需求。

  2. 在 Kafka 生產者配置中,將 CloudEvents 的 partitionkey 映射到 Kafka 的分區鍵。

  3. 確保消費者能夠並行處理來自不同分區的事件。

  4. 監控分區的使用情況,必要時調整分區數量或分區策略。

  5. 考慮實現動態分區分配,以適應負載變化。

使用案例

  1. 用戶活動追蹤: 使用用戶 ID 作為分區鍵,確保同一用戶的所有事件按順序處理。

  2. 物聯網數據處理: 使用設備 ID 作為分區鍵,將來自同一設備的數據分組。

  3. 訂單處理系統: 使用訂單 ID 作為分區鍵,確保訂單相關事件的順序處理。

安全考慮

  1. 確保分區鍵不包含敏感資訊,因為它可能在系統中廣泛傳播。

  2. 注意分區不均勻可能導致的性能問題和潛在的拒絕服務風險。

  3. 實施適當的訪問控制,以防止未授權的分區操作。

相關 ADP

參考資料