簡體   English   中英

Kafka從主題刪除記錄,而不使用偏移量,而是通過記錄的字段

[英]Kafka delete records from the topic without using offsets but by a field of the record

假設我有一個名為“批處理”的主題,具有1個分區,並且我向其發布了數百萬條記錄以進行處理。 我有一個由3個人組成的消費群體來處理這些數百萬條記錄。 我遇到一種情況,即我不再需要處理滿足某些條件(例如age < 50的某些消息子集

如何以編程方式從主題中刪除這些消息。 就像我單擊UI中的“取消”按鈕一樣,它應該從age < 50的主題中刪除那些記錄的子集,以便消費者不會對其進行處理。

我知道我可以通過運行帶有偏移量的命令行來刪除消息:-https: //github.com/apache/kafka/blob/trunk/bin/kafka-delete-records.sh

還有Java API,但也有偏移量:

https://kafka.apache.org/11/javadoc/org/apache/kafka/clients/admin/AdminClient.html#deleteRecords-java.util.Map-org.apache.kafka.clients.admin.DeleteRecordsOptions-

Delete records whose offset is smaller than the given offset of the corresponding partition

但就我而言,我無法使用偏移量,因為我只需要刪除某些記錄,而不是刪除all records smaller than the given offset

我需要指出的主要問題是,您不應將Kafka中的數據與數據庫中的數據視為同一事物。 Kafka並非以這種方式工作(例如:當我單擊X按鈕時,Y記錄將被刪除)。

相反,您應該將主題視為永無止境的數據流。 消費者將獨立消費和處理針對Kafka主題產生的每條記錄。

將主題視為流可為您提供不同的解決方案:

您可以在第二個主題中使用過濾的結果!

 Streaming Diagram ___ Topic A ____ -- Produced Messages --> | | _______________________ |________________| --> | | | Filtering Application | ___ Topic B ___ | | | | <-- |_______________________| <-- Consumed Messages -- |________________| 

解釋非常簡單,您向主題A生成了消息。然后使用“ Filtering Application ,該Filtering Application將:

  1. 消費來自主題A的消息
  2. 基於一些業務邏輯(例如: age < 50 )將進行過濾
  3. 生成過濾到主題B的消息

最后,您的消費者將收到來自主題B的消息。

現在,在創建過濾應用程序時,您有兩個選擇:

  1. 使用使用者和生產者實施基本解決方案
  2. 使用Kafka流
  3. 使用KSQL

您不能,Kafka並非旨在像數據庫一樣使用,它實際上是一個不變的提交日志。 刪除記錄工具主要用於管理任務。

有一個例外,那就是使用log compaction 如果主題緊湊,則可以通過將記錄發布到具有NULL值的主題來刪除鍵的值。 壓縮主題通常​​像數據庫提交日志一樣使用,您可以將它們讀入某些下游服務中,在該服務中它像表一樣實現。 NULL值應解析為記錄刪除。

因此,在您的用例中,您可以將主題具體化為針對查詢而優化的系統,例如SELECT key FROM TABLE WHERE age > 50; ,並將每個值為NULL鍵的記錄發布回Kafka主題。 您甚至可以在主題的開頭開始您的消費者,並記下哪些記錄的age > 50並執行相同的操作,但是效率不高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM