Google cloud dataflow 消费者组中的Apache Beam KafkaIO消费者正在阅读相同的消息

Google cloud dataflow 消费者组中的Apache Beam KafkaIO消费者正在阅读相同的消息,google-cloud-dataflow,apache-beam-io,apache-beam,apache-beam-kafkaio,Google Cloud Dataflow,Apache Beam Io,Apache Beam,Apache Beam Kafkaio,我在数据流中使用KafkaIO来读取来自一个主题的消息。我使用以下代码 KafkaIO.<String, String>read() .withReadCommitted() .withBootstrapServers(endPoint) .withConsumerConfigUpdates(new ImmutableMap.Builder<String, Object>()

我在数据流中使用KafkaIO来读取来自一个主题的消息。我使用以下代码

KafkaIO.<String, String>read()
                .withReadCommitted()
                .withBootstrapServers(endPoint)
                .withConsumerConfigUpdates(new ImmutableMap.Builder<String, Object>()
                .put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true)
                .put(ConsumerConfig.GROUP_ID_CONFIG, groupName)
                .put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 8000).put(ConsumerConfig.REQUEST_TIMEOUT_MS_CONFIG, 2000)
                .build())
//                .commitOffsetsInFinalize()
                .withTopics(Collections.singletonList(topicNames))
                .withKeyDeserializer(StringDeserializer.class)
                .withValueDeserializer(StringDeserializer.class)
                .withoutMetadata();
KafkaIO.read()
.withReadCommitted()
.WithBootsTrapServer(端点)
.withConsumerConfigUpdates(新的ImmutableMap.Builder()
.put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,true)
.put(ConsumerConfig.GROUP\u ID\u CONFIG,groupName)
.put(ConsumerConfig.AUTO\u COMMIT\u INTERVAL\u MS\u CONFIG,8000).put(ConsumerConfig.REQUEST\u TIMEOUT\u MS\u CONFIG,2000)
.build())
//.CommitteofSetsinFinalize()
.withTopics(集合.单音列表(主题名称))
.withKeyDeserializer(StringDeserializer.class)
.withValueDeserializer(StringDeserializer.class)
.没有元数据();
我使用direct runner在本地运行数据流程序。一切正常。我并行运行同一程序的另一个实例,即另一个使用者。现在,我在管道的处理过程中看到了重复的消息

虽然我已经提供了消费者组id,但启动另一个具有相同消费者组id(相同程序的不同实例)的消费者不应该处理由另一个消费者处理的相同元素,对吗


如何使用dataflow runner实现这一点?

我认为您设置的选项不能保证跨管道的消息传递不重复

  • ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG:这是一个不适用于Beam管道本身的配置。看起来这是最好的努力,而且是周期性的,所以您可能仍然可以在多个管道中看到重复项

  • withReadCommitted():这只意味着Beam不会读取未提交的消息。同样,它不会防止跨多个管道的重复

有关用于确定卡夫卡震源起点的协议波束震源,请参见


为了保证不重复交付,您可能必须阅读不同主题或不同订阅。

即使我面临此问题,我也希望运行多个consumer实例,从同一主题阅读。但消息正在传递到所有正在运行的实例。调试完我找到的配置后,组名将附加一些唯一的前缀,并且每个实例都有唯一的组名。ex-group.id=Reader-0_offset_consumer_559337182_my_group.id=Reader-0_offset_consumer_559337345_my_group,因此每个实例都分配了唯一的group.id,这就是消息传递到所有实例的原因。