Spring boot 带循环的Linux kafka producer cli工具

Spring boot 带循环的Linux kafka producer cli工具,spring-boot,apache-kafka,spring-kafka,kafkacat,Spring Boot,Apache Kafka,Spring Kafka,Kafkacat,我有一个spring boot中的worker,它用20个分区来听kafka主题。 我创建了以下侦听器: @KafkaListener(topics = "mytopic") public void listen(@Payload(required = true) IncomingMessage msg, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition, @Header(KafkaHeaders

我有一个spring boot中的worker,它用20个分区来听kafka主题。 我创建了以下侦听器:

@KafkaListener(topics = "mytopic")
public void listen(@Payload(required = true) IncomingMessage msg, 
        @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
        @Header(KafkaHeaders.OFFSET) long offset) {
在这个侦听器中,我打印了分区,发现我所有的消息都来自同一个分区号-17。这意味着生产者端正在将所有消息写入同一分区

我的容器工厂是ConcurrentKafkaListenerContainerFactory,因此我希望能够同时处理多个事件,这意味着我需要不同的分区来在其中包含事件

Linux机器中的生产者端是kafkacat,它将事件生成到本主题中。似乎卡夫卡卡特没有能力以循环方式发送到分区

问题是,我必须使用一些CLI工具来生成事件,而不是服务。 是否有任何方法可以使用CLI工具克服此问题?我找不到任何可执行此操作的cli工具

我考虑在文件中维护一个分区号,并读取它,然后在kafkacat命令中提供分区号,然后增加分区号%partitions,但这不是线程安全的

注意:主题没有密钥,我只生成有价值的消息,不关心密钥。

如评论所述,任何其他卡夫卡客户端都会这样做


当然,我们非常欢迎您编写自己的Spring Boot CLI工具来执行自己的逻辑

,正如我之前所评论的,在找到此解决方案-只需将此参数添加到kafkacat:

-X topic.partitioner=murmur2_random

当记录中不存在密钥时,默认的Kafka生产者分区器为循环。你确定kafkacat实用程序没有被-K或-p开关调用吗?你能做一个:kafka-consumer-groups.sh-bootstrap server:-group-description PS:如果你不知道你的消费者组名,只需使用-list first运行吗?这很奇怪,我的bash脚本是:kafkacat-p-t$mytopic-b$mybroker,当我多次运行它时,我总是将事件发送到同一个分区17我不知道为什么会出现github问题?看到他们的想法了吗?我认为CLI工具无法维护上次发送到的最后一个分区号。因为它不是一个保存状态的服务,它只是一个cli工具。cli工具保存状态。。。仅仅因为没有web服务器或数据库并不意味着内存中的映射和变量不可用这很有帮助: