我正在开发一个基于kafka的应用程序,其中kafka监听器将监听记录;一旦kafka收到记录,我就需要将记录写入文件。 这里将记录写入我们想要使用batchsize和超时设置微缩的文件。 例如,batchsize为10,超时设置为1000 ms,这意味着在写入1000 ms等待时间的文件之前等待10条记录。如果在任何情况下Kafka在1000毫秒内只收到5条记录,那么在该批次中只写入5条记录。
我在Java中如何有效地做到这一点。
答案 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,旨在支持您描述的流程。