Spring boot 春季卡夫卡会延迟消费记录

Spring boot 春季卡夫卡会延迟消费记录,spring-boot,spring-kafka,Spring Boot,Spring Kafka,我在应用程序中使用了spring kafka。我想增加15分钟的延迟,以便使用其中一个侦听器的记录—kafkaRetryListenerContainerFactory。我有两个听众。以下是我的配置: @Bean public ConcurrentKafkaListenerContainerFactory<String, Object> kafkaListenerContainerFactory() { ConcurrentKafkaListenerContainerFact

我在应用程序中使用了spring kafka。我想增加15分钟的延迟,以便使用其中一个侦听器的记录—kafkaRetryListenerContainerFactory。我有两个听众。以下是我的配置:

@Bean
public ConcurrentKafkaListenerContainerFactory<String, Object> kafkaListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(primaryConsumerFactory());
    return factory;
}

@Bean
public ConcurrentKafkaListenerContainerFactory<String, Object> kafkaRetryListenerContainerFactory() {
    ConcurrentKafkaListenerContainerFactory<String, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(retryConsumerFactory());
    factory.setConcurrency(this.kafkaConfigProperties.getConsumerConcurrency());
    factory.setAutoStartup(true);
    factory.getContainerProperties().setAckMode(AckMode.MANUAL_IMMEDIATE);       
    return factory;
}
我的春季卡夫卡版本是2.3.4

以下是配置值:

max.poll.interval.ms=1200000(高于thread.sleep)

heartbeat.interval.ms=3000

session.timeout.ms=10000

我试过ack.nack(900000);仍然存在重新平衡错误


任何帮助都将不胜感激

过滤器不是正确的方法;您需要
Thread.sleep()
线程,并确保
max.poll.interval.ms
大于轮询接收到的记录的总睡眠和处理时间

在2.3中,容器可以选择在轮询之间休眠;在早期版本中,你必须自己睡觉

编辑

我刚刚在我的
服务器.properties
(Mac OS上的自制)中找到了这个:

这解释了为什么我们看到最初分配给第一个使用者的分区(请参见下面的注释)


将其设置回默认值3000对我来说很有用。

Ok。所以你要说的是,过滤后的记录不会被错误地使用;过滤就是丢弃你不感兴趣的记录。打开调试日志并将日志发布到某个地方(pastebin等)。我已经更新了这个问题。我有两个卡夫卡集装箱工厂供两位听众使用。从日志中,我可以看到值设置正确。在提供的示例中,有2个侦听器,每个侦听器的并发性为6。并发容器为每个主题激发6个子容器。问题(由0重新平衡延迟引起)是第一个子容器获取所有6个分区;然后,当其他5个容器启动时,会启动重新平衡,但第一个容器(消费者)在睡眠中被阻塞。增加重新平衡延迟使代理有时间在分配分区之前等待所有6个使用者启动。
@KafkaListener(topics = "${spring.kafka.retry.topic}", groupId = "${spring.kafka.consumer-group-id}", 
        containerFactory = "kafkaRetryListenerContainerFactory", id = "retry.id")
public void retryMessage(ConsumerRecord<String, String> record, Acknowledgment acknowledgment) {
    Thread.sleep(900000);
    LOG.info(String.format("Consumed retry message -> %s", record.toString()));
    acknowledgment.acknowledge();
}
Attempt to heartbeat failed since group is rebalancing
############################# Group Coordinator Settings #############################

# The following configuration specifies the time, in milliseconds, that the GroupCoordinator will delay the initial consumer rebalance.
# The rebalance will be further delayed by the value of group.initial.rebalance.delay.ms as new members join the group, up to a maximum of max.poll.interval.ms.
# The default value for this is 3 seconds.
# We override this to 0 here as it makes for a better out-of-the-box experience for development and testing.
# However, in production environments the default value of 3 seconds is more suitable as this will help to avoid unnecessary, and potentially expensive, rebalances during application startup.
group.initial.rebalance.delay.ms=0