本文詳細介紹了如何將 Kafka Streams 用戶端庫與 Azure 事件中心結合使用。
注意
Kafka Streams 功能僅適用於事件中 樞進階和專用層的公開預覽 。
概觀
Apache Kafka Streams 是 Java 唯一的用戶端連結庫,可提供處理串流數據的架構,並針對 Kafka 主題中儲存的數據建置即時應用程式。 所有處理都會限定於用戶端,而 Kafka 主題在輸出寫入目的地主題之前,會做為元數據的數據存放區。
事件中樞提供 Kafka 端點,以搭配您現有的 Kafka 用戶端應用程式使用,作為執行您自己的 Kafka 叢集的替代方案。 事件中樞適用於許多現有的 Kafka 應用程式。 如需詳細資訊,請參閱 適用於 Apache Kafka 的事件中樞。
搭配使用 Kafka Streams 搭配 Azure 事件中樞
Azure 事件中樞 原生支援AMQP和Kafka通訊協定。 不過,為了確保相容的 Kafka Streams 行為,Kafka 用戶端必須更新某些預設組態參數。
| 屬性 | 事件中樞的默認行為 | Kafka 數據流的修改行為 | 說明 |
|---|---|---|---|
messageTimestampType |
設定為 AppendTime |
應設定為 CreateTime |
Kafka Streams 依賴建立時間戳,而不是附加時間戳 |
message.timestamp.difference.max.ms |
允許的最大值為90天 | 屬性只會用來控管過去的時間戳。 未來的時間設定為 1 小時,且無法變更。 | 符合 Kafka 協議規範 |
min.compaction.lag.ms |
允許的最大值為 2 天 | ||
| 無限保留主題 | 每個主題分割區的大小截斷 250 GB | ||
| 刪除無限保留主題的記錄 API | 未實作。 因應措施是可以更新主題,也可以設定有限的保留時間。 | 此功能將在 GA 中受支援 |
其他考量
以下是要牢記的其他一些考慮。
- Kafka 數據流用戶端應用程式必須獲得整個命名空間的管理、讀取和寫入許可權,才能建立數據流處理的暫存主題。
- 暫存主題和數據分割會計入指定命名空間的配額。 在預置命名空間或集群時,應考慮這些指標。
- “Offset” Store 的無限保留時間受庫存單位 (SKU) 的最大消息保留時間限制。 檢查 這些階層特定值的事件中樞配額 。
它們包括更新 中的主題配置 messageTimestampType 以使用 CreateTime (即 Event creation time) 而不是 AppendTime (即日誌附加時間)。
若要覆寫預設行為(必要),必須在 Azure Resource Manager (ARM) 中設定下列設定。
注意
只會顯示 ARM 範本的特定部分,以醒目提示需要更新的組態。
{
"parameters": {
"namespaceName": "contoso-test-namespace",
"resourceGroupName": "contoso-resource-group",
"eventHubName": "contoso-event-hub-kafka-streams-test",
...
"parameters": {
"properties": {
...
"messageTimestampType": "CreateTime",
"retentionDescription": {
"cleanupPolicy": "Delete",
"retentionTimeInHours": -1,
"tombstoneRetentionTimeInHours": 1
}
}
}
}
}
Kafka Streams 概念
Kafka 流在 Kafka 生產者和消費者 API 上提供了一個簡單的抽象層,以幫助開發人員更快地開始使用即時流式處理場景。 輕量連結庫取決於內部傳訊層的 Apache Kafka 相容代理程式(例如 Azure 事件中樞),並管理容錯本機狀態存放區。 使用交易 API 時,Kafka 串流連結庫支援豐富的處理功能,例如一次處理一次,一次處理一筆記錄。
記錄因事件時間型視窗化作業而失序而受益。
注意
資料流
數據流是 Kafka 主題的抽象表示法。 它是由未系結、持續更新不可變數據記錄的數據集所組成,其中每個數據記錄都是索引鍵/值組。
串流處理拓撲
Kafka 串流應用程式會透過處理器拓撲所代表的 DAG(導向無循環圖)來定義計算邏輯。 處理器拓撲包含數據流處理器(拓撲中的節點),代表由數據流(拓撲中的邊緣)連接的處理步驟。
串流處理器可以鏈結至上游處理器或下游處理器,但某些特殊情況除外:
- 來源處理器 - 這些處理器沒有任何上游處理器,而且直接從一或多個數據流讀取。 然後,它們可以鏈結至下游處理器。
- 接收處理器 - 這些處理器沒有任何下游處理器,而且必須直接寫入數據流。
您可以使用 Kafka Streams DSL 或較低層級的處理器 API 來定義串流處理拓撲。
數據流和數據表雙重性
串流和數據表是 Kafka Streams DSL 所提供的 2 個不同但實用的抽象概念,可模型化時間序列和關係型數據格式,這些格式必須並存以供串流處理使用案例使用。
Kafka 進一步擴展了它,並在流和表之間引入了對偶性,其中
- 數據流可視為數據表的變更記錄,以及
- 數據表可視為數據流中每個索引鍵之最新值的快照集。
此雙重性可讓數據表和數據流視使用案例需要交換使用。
例如:
- 使用動態交易聯結靜態客戶數據(模型化為數據表),以及
- 聯結日交易員投資組合中不斷變化的投資組合倉位(模型化為數據流),以及最新的市場數據摘要(模型化為數據流)。
時間
Kafka Streams 允許視窗化和寬限函式允許擷取順序錯亂的數據記錄,並且仍包含在處理中。 為了確保此行為是確定性的,Kafka 流中有更多的時間概念。 其中包括:
- 創建時間(也稱為“事件時間”)- 這是事件發生和創建數據記錄的時間。
- Processing time (處理時間) - 這是流處理應用程式處理數據記錄(或使用數據記錄)的時間。
- 追加時間(也稱為“創建時間”)- 這是存儲數據並將其提交到 Kafka 代理存儲的時間。 它與創建時間不同,因為創建事件與代理實際攝取之間存在時間差異。
具狀態作業
狀態管理可讓複雜的串流處理應用程式,例如聯結和匯總來自不同數據流的數據。 這可透過 Kafka Streams 所提供的狀態存放區來達成,並使用 Kafka Streams DSL 中的具狀態運算符進行存取。
DSL 中的具狀態轉換包括:
- 聚合
- 加入
- 視窗化 (作為匯總和聯結的一部分)
- 應用自定義處理器和轉換器(可以是有狀態的)進行處理器 API 集成
視窗和寬限
Kafka Streams DSL 中的視窗化作業可讓開發人員控制針對匯總和聯結等具狀態作業將記錄分組的方式。
視窗化作業也允許指定寬限期的規格,為指定視窗的錯序記錄提供一些彈性。 指定窗口的記錄,並會在指定的窗口之後抵達,但接受寬限期內。 寬限期結束之後抵達的記錄會被捨棄。
應用程式必須使用視窗化和寬限期控件來改善順序錯亂記錄的容錯。 適當的值會根據工作負載而有所不同,而且必須以經驗方式識別。
處理保證
商務和技術使用者尋求從串流處理工作負載的輸出中擷取重要的商業見解,這可轉化為高交易性保證需求。 Kafka 流與 Kafka 事務協同工作,通過與 Kafka 相容的代理(例如 Azure 事件中心)的底層存儲系統集成來確保事務處理保證,以確保以原子方式寫入偏移提交和狀態存儲更新。
為了確保交易處理保證, processing.guarantee Kafka Streams 組態中的設定必須從的預設值 at_least_once 更新為 exactly_once_v2 (在 Apache Kafka 2.5 之前或之後的用戶端版本)或 exactly_once (針對 Apache Kafka 2.5.x 之前的用戶端版本)。
下一步
本文概略介紹了適用於 Kafka 的事件中樞。 若要深入了解,請參閱適用於 Azure 事件中樞的 Apache Kafka 開發人員指南。
如需具有建立事件中樞並使用 SAS 或 OAuth 進行存取的逐步指示教學課程,請參閱快速入門:使用 Kafka 通訊協定透過事件中樞的資料串流。
此外,請參閱 GitHub 上的 OAuth 範例。