簡體   English   中英

重構 Spring 批處理作業以使用 Apache Kafka(解耦讀者和作者)

[英]Refactoring a Spring Batch Job to use Apache Kafka (Decoupling readers and writers)

我目前有一個 Spring 批處理作業,只需一步即可從 Oracle 讀取數據,將數據傳遞給多個 Spring 批處理處理器 ( CompositeItemProcessor ),並將數據寫入不同的目的地,例如 Oracle 和文件 ( CompositeItemWriter ):

<batch:step id="dataTransformationJob">
    <batch:tasklet transaction-manager="transactionManager" task-executor="taskExecutor" throttle-limit="30">
        <batch:chunk reader="dataReader" processor="compositeDataProcessor" writer="compositeItemWriter" commit-interval="100"></batch:chunk>
    </batch:tasklet>
</batch:step>

上述步驟中, compositeItemWriter配置了2個writer,依次運行,將1億條記錄寫入Oracle和一個文件。 此外, dataReader有一個同步讀取方法,以確保多個線程不會從 Oracle 讀取相同的數據。截至今天,這項工作需要 1 小時 30 分鍾才能完成。

我計划將上述工作分解為兩部分,以便讀取器/處理器生成關於 2 個 Kafka 主題的數據(一個用於將數據寫入 Oracle,另一個用於將數據寫入文件)。 在等式的另一邊,我將有一個具有兩個並行流的作業,從每個主題讀取數據並將數據分別寫入 Oracle 和文件。

考慮到上述架構,我想了解如何重構 Spring 批處理作業以使用 Kafka。 我認為以下方面是我需要解決的問題:

  1. 在現有的不使用Kafka的作業中,我的throttle limit是30; 但是,當我在中間使用 Kafka 時,如何確定正確的油門限制?
  2. 在現有作業中,我的提交間隔為 100。這意味着每 100 條記錄將調用CompositeItemWriter ,並且每個編寫器將解壓縮該塊並對其調用 write 方法。 這是否意味着當我寫到 Kafka 時,將有 100 個發布調用到 Kafka?
  3. 有沒有辦法在 Kafka 中將多行組合成一條消息以避免 multiple.network 調用?
  4. 在消費者方面,我想要一個 Spring 批處理多線程步驟,能夠並行讀取主題的每個分區。 Spring Batch 是否已經有內置類來支持它?
  5. 消費者將使用標准的 JdbcBatchITemWriter 或 FlatFileItemWriter 來寫入從 Kafka 讀取的數據,所以我相信這應該是標准的 Spring Batch in Action。

注意:我知道 Kafka Connect 但不想使用它,因為它需要設置一個 Connect 集群,而我沒有可用的基礎設施來支持它。

問題的答案:

  1. 您的 kafka 生產者不需要節流,數據應該在 kafka 中可用以供盡快使用。 根據實施,您的消費者可能會受到限制(如果需要)。
  2. Kafka Producer 是可配置的。 100 條消息並不一定意味着 100.network 呼叫。 您可以將 100 條消息寫入 kafka 生產者(根據配置可能會或可能不會對其進行緩沖)並將緩沖區刷新到 force.network 調用。 這將導致(幾乎)相同的現有行為。
  3. 由於 kafka 消息的有效負載完全取決於您,因此可以將多行組合在一條消息中。 但是你multiple rows into one single message in Kafka to avoid multiple.network calls? 無效,因為可以在 single.network 調用中生成/使用多條消息(行)。 對於您的初稿,我建議通過讓一行對應一條消息來保持簡單。
  4. 據我所知不是。 (但我在這方面可能是錯的)
  5. 是的,我相信他們應該工作得很好。

暫無
暫無

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

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