在java中实现微批处理

时间:2018-05-05 16:43:28

标签: java apache-kafka kafka-consumer-api

我正在开发一个基于kafka的应用程序,其中kafka监听器将监听记录;一旦kafka收到记录,我就需要将记录写入文件。 这里将记录写入我们想要使用batchsize和超时设置微缩的文件。 例如,batchsize为10,超时设置为1000 ms,这意味着在写入1000 ms等待时间的文件之前等待10条记录。如果在任何情况下Kafka在1000毫秒内只收到5条记录,那么在该批次中只写入5条记录。

我在Java中如何有效地做到这一点。

2 个答案:

答案 0 :(得分:1)

在这种情况下,常见的方法之一是将所有记录放入队列中。当你的队列达到10或1000ms之后,有一个线程可以记录这些记录,具体取决于最先出现的内容。

消费者代码:

 CountDownLatch countDownLatch = new CountDownLatch(10);
 countDownLatch.await(1000, TimeUnit.MILLISECONDS);
 int queueSize = queue.size();
 for(int i = 0; i < queueSize; ++i) {
     ... do your work here or put in a batch a do it right after loop
 }

制片人代码:

 Record record = ...receive new record...
 queue.put(record);
 consumer.getCountDownLatch().countDown();

作为一个队列,我建议使用未绑定的队列,例如LinkedTransferQueue,因为你不想在达到10个任务时停止你的制作人,你仍然需要使用kafka的结果。

另一个选项是reactive streams

答案 1 :(得分:1)

听起来你应该使用Kafka Connect API。这是part of Apache Kafka,旨在支持您描述的流程。

developer guide here