Apache kafka HighLevel Consumer - 理解

时间:2015-03-31 19:33:31

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

我一直在寻找Apache kafka实现HighLevel使用者(我不想使用该消息,我只需要将数据放入MongoDB)v0.8.1.1

我查看了以下链接,其中显示了有关如何实施消费者的非常详细的信息。

Apache Kafka consumer wiki Another kafka consumer

但是我仍然对在所有线程关闭后Consumer如何重新启动一无所知。例如。让我说我有4个消费者运行的线程,他们消耗了来自kafka经纪人的所有消息,所以一旦没有消息,所有消费者将无所事事,在特定超时后它将被关闭所以我不确定消费者如何再次重启当kafka经纪人有新消息时。

有人可以共享一些代码或至少有一些指针。还有一种方法,我们可以在一些回调方法中使用我们的业务逻辑,当有消息而不是while循环时,它将被调用。

1 个答案:

答案 0 :(得分:3)

我认为您可能误解了关机期间超时的使用。从理论上讲,无论这些事件之间的时间间隔是多少,您都会消耗无限的事件流,因此除非您更新代码或计算机崩溃,否则您的使用者应永远不会关闭。在实际需要关闭消费者的情况下,10000毫秒超时的作用是让Kafka消费者有足够的时间将其最后一次读取偏移量写入ZooKeeper,这样当消费者重新启动时,它将从它处理的最后一个偏移量恢复。这个消费者关闭通常发生在你的程序关闭时(可能是一个InterruptedException),而不仅仅是消费者。因此,重新启动程序时将重新启动耗材。

修改

我应该补充一点,Kafka的 ConsumerIterator 之所以遵循这种永无止境的消费模式。迭代器的 next 方法将始终阻塞,直到它可以读取下一条消息。因此,实例中达到超时的唯一方法是消费者线程是否被某些异常关闭。

编辑2

我还没有看到任何支持回调的Kafka消费者API我认为你现在唯一的选择就是编写自己的回调实现,例如:

public interface Callback {
  void call(MessageAndMetadata message);
}

Executor executor = Executors.newCachedThreadPool();
final Callback<byte[], byte[]> callback = new MyCallback();
while (it.hasNext()) {
  final MessageAndMetadata message = it.next();
  executor.submit(new Runnable() {
    public void run() {
      callback.call(message);
    }
  });
}

你可能会感兴趣他们是currently rewriting the consumer API for Kafka 0.9,但我认为我没有在重写中看过回调(虽然我可能错了)。