Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 未删除过期的Apache Kafka邮件_Apache Kafka - Fatal编程技术网

Apache kafka 未删除过期的Apache Kafka邮件

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);

我有一个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);
返回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();
}