Apache kafka Kafka consumer分区获取最大字节的奇怪行为

Apache kafka Kafka consumer分区获取最大字节的奇怪行为,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我有一个主题a,有12个分区。我有3个卡夫卡经纪人在一个集群中。对于主题A,每个代理有4个分区。我没有创建任何副本,因为我不关心恢复能力 我有一个使用kafka客户端库的简单Java消费者。我在酒店里提到了以下几点 Properties properties = new Properties(); properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-serverA:9092,

我有一个主题a,有12个分区。我有3个卡夫卡经纪人在一个集群中。对于主题A,每个代理有4个分区。我没有创建任何副本,因为我不关心恢复能力

我有一个使用kafka客户端库的简单Java消费者。我在酒店里提到了以下几点

        Properties properties = new Properties();
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-serverA:9092,kafka-serverB:9092,kafka-serverC:9092");
        properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, groupID);
        properties.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        properties.setProperty("max.partition.fetch.bytes", "100000");

还有更多用于消费者记录和打印记录的代码,工作正常。我在主题中有12条消息,我已经通过“kafka-run-class.sh kafka.admin.ConsumerGroupCommand”验证了每个分区中都有一条消息。消息大小为100000字节,完全等于max.partition.fetch.bytes限制

当我投票时,我会看到12条消息作为回应返回。然而,反应非常不稳定。有时我看到来自4个分区的消息,表明只有一个代理响应使用者请求,有时我看到8个。我从来没有收到来自所有12个分区的响应。为了测试,我删除了max.partition.fetch.bytes属性。我观察到了同样的行为

我遗漏了什么吗?在为请求提供服务时,引导配置中的serve1、server2、server3似乎没有选择所有3个代理


非常感谢您的帮助。我在不同的机器上运行经纪人和消费者,并且他们的规模足够大

我建议转向更简单的卡夫卡实现并重新测试。卡夫卡经纪人之间和/或动物园管理员之间的沟通似乎存在问题

将Kafka和Zookeeper重建为单个节点。将所有消息发送到单个节点。请再次尝试从该主题中删除


这将有助于隔离您遇到的问题。

我建议使用更简单的Kafka实现并重新测试。卡夫卡经纪人之间和/或动物园管理员之间的沟通似乎存在问题

将Kafka和Zookeeper重建为单个节点。将所有消息发送到单个节点。请再次尝试从该主题中删除

这将有助于隔离您遇到的问题

我遗漏了什么吗?似乎服务器1、服务器2、服务器3在 在为服务器提供服务时,引导配置没有选择所有3个代理 请求

在Kafka
bootstrap.servers
属性中,您列出了所有优秀的代理。 将挑选其中一个代理来获取元数据,元数据基本上是关于主题有多少个分区以及哪个代理是这些分区的领导者的信息

无论选择哪台服务器,其中一台都应提供另一台服务器的信息

检查您的所有代理是否相互认识,即他们属于同一Kafka群集,即他们指向同一个zookeeper实例


您提到的所有代理IP必须可供您的消费者访问。因此,请确保已设置适当的
播发.listeners
属性

例如,如果
advised.listeners=PLAINTEXT://1.2.3.4:9092
,则消费者必须能够访问
1.2.3.4:9092


此外,默认情况下,卡夫卡消息会在一段时间后定期自动提交,如果某个消费者使用特定的
groupId
读取消息,则不会再次使用这些消息,因为它们已提交。因此,您可能还需要尝试更改
group.id
属性并重新检查


另外,请检查您是否正在使用相同的组id运行多个使用者,在这种情况下,一些分区将分配给一个使用者,另一些分配给另一个使用者

您可以使用
kafka console consumer
--from start
标记给出主题并查看是否所有消息都已被使用,从而对此进行故障排除


您可能还需要检查参数并尝试增加该值,以防网络拥塞导致客户端从一个引导服务器切换到另一个引导服务器

我遗漏了什么吗?似乎服务器1、服务器2、服务器3在 在为服务器提供服务时,引导配置没有选择所有3个代理 请求

在Kafka
bootstrap.servers
属性中,您列出了所有优秀的代理。 将挑选其中一个代理来获取元数据,元数据基本上是关于主题有多少个分区以及哪个代理是这些分区的领导者的信息

无论选择哪台服务器,其中一台都应提供另一台服务器的信息

检查您的所有代理是否相互认识,即他们属于同一Kafka群集,即他们指向同一个zookeeper实例


您提到的所有代理IP必须可供您的消费者访问。因此,请确保已设置适当的
播发.listeners
属性

例如,如果
advised.listeners=PLAINTEXT://1.2.3.4:9092
,则消费者必须能够访问
1.2.3.4:9092


此外,默认情况下,卡夫卡消息会在一段时间后定期自动提交,如果某个消费者使用特定的
groupId
读取消息,则不会再次使用这些消息,因为它们已提交。因此,您可能还需要尝试更改
group.id
属性并重新检查


另外,请检查您是否正在使用相同的组id运行多个使用者,在这种情况下,一些分区将分配给一个使用者,另一些分配给另一个使用者

您可以使用
kafka console consumer
--from start
标记给出主题并查看是否所有消息都已被使用,从而对此进行故障排除



您可能还需要检查参数并尝试增加值,以防网络拥塞导致客户端从一个引导服务器切换到另一个引导服务器。

您总共只有12条消息(每个分区一条)还是每个分区都有足够的消息