卡夫卡简单的消费者间歇性地丢失了消息

时间:2015-03-23 17:18:06

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

我有一个Kafka应用程序,我使用kafka-console-consumer.sh消费消息,如下所示:

$./kafka-console-consumer.sh --zookeeper zookeeperhost:2181 --topic myTopic

给出了我通过Kafka消费者写给Kafka经纪人的所有消息,没有任何遗漏。

最近,我将应用程序部署在不能访问zookeeperhost的不同环境中(由于某种原因)。所以我使用的是kafka-simple-consumer-shell.sh,如下所示:

$./kafka-simple-consumer-shell.sh --broker-list brokerhost:9092 --topic myTopic --partition 0 --max-messages 1

但是有了这个,我发现很少有消息(大约2-4个中的2-4个)被遗漏。有人可以解释kafka-simple-consumer-shell.sh如何读取消息。

我怀疑可能有些消息会转到某个不同的分区,因为我只是从分区0读取所以我不是每次都收到所有消息。但我不知道如何检查有多少分区?什么是其他分区的ID?我试过1但它不起作用。

有人可以帮忙。

1 个答案:

答案 0 :(得分:3)

kafka-simple-consumer.sh只是创建一个从一个分区读取消息的使用者。因此,您的命令只会从partition 0 of myTopic中的brokerhost:9092中读取一条消息。如果分区1不在同一代理中,则它将不像您所做的那样工作。 (有关更多信息,请查看Code from GitHub

如果您可以访问Zookeeper主机,则只需使用

检查分区在群集中的分布方式
bin/kafka-topics.sh --describe --zookeeper zookeeperhost:2181 --topic myTopic

但如果您无法访问Zookeeper主机,我可以通过两种方式来考虑。

  1. 提供包含所有代理作为参数的列表,并尝试从0到N的分区号。您可以--broker-list格式向broker1:port2,broker2:port2,broker3:port3提供多个代理。然后,您可以确定整个群集中存在多少个分区,但您仍然不知道哪个代理具有哪些分区。
  2. 手动检查每个代理的日志目录。检查/tmp/kafka-logs(如果您使用的是默认日志目录)。您会找到myTopic-0myTopic-1等目录,其格式为topic-partition#。您可以使用此方法检查哪个代理手动具有哪些分区。