本主题应仅包含每个X的最新“文档X已更新”事件。但我无法正确配置主题并保留多个副本。
我的想法是保持细分,以及所有相关的超时,刷新和保留时间。
主题设置(我没有清楚地了解每个选项的位置和前缀,因此可能有几个未使用和不相关的选项以及夸大的数字 - 欢迎更正):
"cleanup.policy" -> "compact",
"file.delete.delay.ms" -> "10",
"segment.bytes" -> "10000",
"delete.retention.ms" -> "10",
"retention.bytes" -> "10000",
"segment.ms" -> "10",
"retention.ms" -> "10",
"min.cleanable.dirty.ratio" -> "0.001",
"flush.messages" -> "1",
"flush.ms" -> "10",
"min.compaction.lag.ms" -> "1",
"log.cleaner.min.compaction.lag.ms" -> "1"
我使用akka-streams-kafka提供主题:
val ids = List("12345", ...)
val publish: Future[Done] = Source(ids ++ ids ++ ids ++ ids ++ ids)
.map { id =>
ProducerMessage.Message(new ProducerRecord[String, String](topic, id, id), id)
}
.via(producerFlow)
.map(logResult)
.runWith(Sink.ignore)
Await.result(publish, 3.seconds)
等待几秒后,我会计算消息:
var count = 0
val runCount = Consumer
.plainSource(consumerSettings, Subscriptions.topics(topic))
.map { t =>
count += 1
t
}
.runWith(Sink.ignore)
Try { Await.result(runCount, timeout) }
我希望消费者收到ids.length
条消息,但它会在第一次运行时收到所有生成的消息,在后续运行中会更多。
确实发生了一些压缩 - 如果我多次运行测试,消耗的消息数量会停止增长,我会看到kafka日志中的段删除 - 但每个密钥仍然有多条消息。
如何将kafka主题用作快照存储?
使用kafka 0.10.2.1
谢谢。
答案 0 :(得分:1)
根据Kafka规范:"日志压缩可确保Kafka始终保留 至少 数据日志中每个消息密钥的最后已知值单个主题分区"。即Kafka并不保证每个密钥只保留一条消息,但它保证每个密钥始终具有最新的消息版本。
答案 1 :(得分:0)
您可以尝试使用配置来查看是否可以实现所需(请参阅this),但我建议在应用程序级别处理它,仅使用带有该密钥的最新消息作为有效的消息,因为日志压缩在一个单独的线程上运行,并且没有办法在每次更新后触发它(即使有方法,它也不会非常有效)。