Apache kafka 未删除过期的Apache Kafka邮件
我有一个SpringBoot(2.1.3)服务将消息发布到kafka(2.12-2.3.0)主题。该服务创建主题,然后在服务启动后,将retention.ms设置为1秒 正在调试此代码Apache kafka 未删除过期的Apache Kafka邮件,apache-kafka,Apache Kafka,我有一个SpringBoot(2.1.3)服务将消息发布到kafka(2.12-2.3.0)主题。该服务创建主题,然后在服务启动后,将retention.ms设置为1秒 正在调试此代码 @springbootplication() @使能同步 公共类度量应用程序{ 公共静态void main(字符串[]args){ run(MetricsMsApplication.class,args); } @豆子 公共新话题1(){ NewTopic nt=新的NewTopic(“度量”,10,(短)1);
@springbootplication()
@使能同步
公共类度量应用程序{
公共静态void main(字符串[]args){
run(MetricsMsApplication.class,args);
}
@豆子
公共新话题1(){
NewTopic nt=新的NewTopic(“度量”,10,(短)1);
返回nt;
}
@EventListener(ApplicationReadyEvent.class)
private void init()引发ExecutionException、InterruptedException{
Map config=newhashmap();
config.put(AdminClientConfig.BOOTSTRAP_SERVERS_config,“localhost:9092”);
AdminClient=AdminClient.create(config);
ConfigResource资源=新的ConfigResource(ConfigResource.Type.TOPIC,“度量”);
//更新retention.ms值
ConfigEntry retentionEntry=新的ConfigEntry(TopicConfig.RETENTION\u MS\u CONFIG,“1000”);
Map updateConfig=新HashMap();
updateConfig.put(资源,新配置(Collections.singleton(retentionEntry));
AlterConfigsResult AlterConfigsResult=client.alterConfigs(updateConfig);
alterConfigsResult.all();
}
}
我发送了几条消息,数到5,然后启动一个控制台消费者
kafka-console-consumer.bat--引导服务器本地主机:9092--主题admst度量--从头开始
并且仍然可以获得应该过期的消息
kafka日志显示已应用retention.ms配置。我添加了cleanup.policy并将其设置为delete,但这不是必需的,因为这是默认设置
什么会使这些信息被删除?简短的回答是——卡夫卡并不是为了满足如此低的保留值而设计的 较长的答案是: kafka将任何(主题)分区的数据存储在段文件中。任何时候,当所有旧段都处于“关闭”状态时,单个段处于“活动”状态并被写入。保留/兼容仅适用于非活动段 当命中log.roll.ms或log.segment.bytes时,卡夫卡将滚动新段。默认值(请参阅)为7天和/或~1GB 还有log.segment.delete.delay.ms,默认情况下,这意味着任何段都会保留至少一分钟 压缩/删除非活动段的工作由日志清理器线程完成。当找不到工作时,这些人会休眠log.cleaner.backoff.ms(15秒),并且只检查每个log.retention.check.interval.ms(5分钟)是否可以清理任何特定段 所有这一切的结果是,默认情况下,任何接近您所寻找的内容的保留值都是不可能的 你可以试着调整上面所有的值,看看你能降到多低,但我打赌这不会很好地扩展到大量的主题
@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();
}