繁体   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