有时(似乎是非常随机的),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)
}
我错过了一些设置吗?
答案 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