如何配置Kafka主题以用作快照存储

时间:2017-06-22 07:02:29

标签: scala apache-kafka

本主题应仅包含每个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

谢谢。

2 个答案:

答案 0 :(得分:1)

根据Kafka规范:"日志压缩可确保Kafka始终保留 至少 数据日志中每个消息密钥的最后已知值单个主题分区"。即Kafka并不保证每个密钥只保留一条消息,但它保证每个密钥始终具有最新的消息版本。

答案 1 :(得分:0)

您可以尝试使用配置来查看是否可以实现所需(请参阅this),但我建议在应用程序级别处理它,仅使用带有该密钥的最新消息作为有效的消息,因为日志压缩在一个单独的线程上运行,并且没有办法在每次更新后触发它(即使有方法,它也不会非常有效)。