过期的Apache Kafka消息未删除

时间:2019-10-24 16:30:23

标签: apache-kafka

我有一个spring-boot(2.1.3)服务,它将消息发布到kafka(2.12-2.3.0)主题。该服务创建主题,然后在服务启动后,将tention.ms设置为1秒。

当前正在调试此代码

@SpringBootApplication()
@EnableAsync
public class MetricsMsApplication {

  public static void main(String[] args) {
    SpringApplication.run(MetricsMsApplication.class, args);
}

@Bean
public NewTopic topic1() {

    NewTopic nt = new NewTopic("metrics", 10, (short) 1);
    return nt;
}

@EventListener(ApplicationReadyEvent.class)
private void init() throws ExecutionException, InterruptedException {
    Map<String, Object> config = new HashMap<>();
    config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");

    AdminClient client = AdminClient.create(config);

    ConfigResource resource = new ConfigResource(ConfigResource.Type.TOPIC, "metrics");

    // Update the retention.ms value
    ConfigEntry retentionEntry = new ConfigEntry(TopicConfig.RETENTION_MS_CONFIG, "1000");
    Map<ConfigResource, Config> updateConfig = new HashMap<ConfigResource, Config>();
    updateConfig.put(resource, new Config(Collections.singleton(retentionEntry)));
    AlterConfigsResult alterConfigsResult = client.alterConfigs(updateConfig);
    alterConfigsResult.all();
}

}

我发送几封邮件,计数到5,然后启动控制台使用者

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic admst-metrics --from-beginning

,并仍然获得应已过期的消息。

kafka日志显示了retention.ms配置已应用。我添加了cleanup.policy并将其设置为delete,但这不是必需的,因为它是默认设置。

什么会使这些消息被删除?

1 个答案:

答案 0 :(得分:2)

最简单的答案-卡夫卡不是为了兑现如此低的保留值而设计的。

更长的答案:

kafka将任何(主题)分区的数据存储在段文件中。任何时候任何一个段都处于“活动”状态,而所有较旧的段都处于“关闭”状态,则写入该段。保留/组合仅适用于非活动细分。

kafka在遇到log.roll.ms或log.segment.bytes时滚动新的段。默认值(请参见https://kafka.apache.org/documentation/#brokerconfigs)为7天和/或〜1GB。

还有log.segment.delete.delay.ms,默认情况下,这意味着任何段都将保留至少一分钟。

压缩/删除非活动段的工作是通过日志清理器线程完成的。那些没有找到工作的日志将休眠log.cleaner.backoff.ms(15秒),并且仅检查每个log.retention.check.interval.ms(5分钟)是否可以清理任何特定段

所有这些操作的结果是,默认情况下不可能保留您想要寻找的任何地方的保留值。

您可以尝试调整所有上述值,然后看您能走多低,但是我敢打赌,对于很多主题来说,缩放比例不会很好。