Kafka只订阅最新消息吗?

时间:2019-01-18 15:16:22

标签: java kotlin apache-kafka kafka-consumer-api

有时(似乎是非常随机的),Kafka发送旧消息。我只需要最新消息,因此它将使用相同的密钥覆盖消息。目前看来,我有多个具有相同密钥的消息,没有被压缩。

我在主题中使用此设置:

cleanup.policy=compact

我正在使用Java / Kotlin和Apache Kafka 1.1.1客户端。

Properties(8).apply {
    val jaasTemplate = "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"%s\" password=\"%s\";"
    val jaasCfg = String.format(jaasTemplate, Configuration.kafkaUsername, Configuration.kafkaPassword)
    put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
            BOOTSTRAP_SERVERS)
    put(ConsumerConfig.GROUP_ID_CONFIG,
            "ApiKafkaKotlinConsumer${Configuration.kafkaGroupId}")
    put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
            StringDeserializer::class.java.name)
    put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
            StringDeserializer::class.java.name)

    put("security.protocol", "SASL_SSL")
    put("sasl.mechanism", "SCRAM-SHA-256")
    put("sasl.jaas.config", jaasCfg)
    put("max.poll.records", 100)
    put("receive.buffer.bytes", 1000000)
}

我错过了一些设置吗?

1 个答案:

答案 0 :(得分:3)

如果每个键只有一个值,则必须使用{strong> Kafka Streams 中的[Route("Original/Details/{id:int}")] [Route("Other/Details/{id:int}")] public async Task<ActionResult> Details(int id) { ... } 抽象:KTable<K,V>。此处使用的主题应将清除策略设置为StreamsBuilder::table(final String topic)

如果使用KafkaConsumer,则只需从代理中提取数据。它没有提供执行某种重复数据删除功能的任何机制。根据是否执行压缩,对于同一密钥,您可以得到 one n 消息。

关于压缩

紧凑并不意味着同一个键的所有旧值都将立即被删除。何时删除同一密钥的compact消息,取决于几个属性。最重要的是:

  • old
  

对于符合清除条件的日志,脏日志与总日志的最小比率

  • log.cleaner.min.cleanable.ratio
  

消息在日志中保持不压缩的最短时间。仅适用于正在压缩的日志。

  • log.cleaner.min.compaction.lag.ms
  

启用日志清除器进程以在服务器上运行。如果使用带有cleanup.policy = compact的任何主题(包括内部偏移量主题),则应启用该选项。如果禁用,这些主题将不会被压缩,并且会不断增长。

有关压缩的更多详细信息,您可以找到https://kafka.apache.org/documentation/#compaction