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

Scala 如何配置Kafka主题以用作快照存储,scala,apache-kafka,Scala,Apache Kafka,此主题应仅为每个X保存最新的“document X Update”事件。但我无法正确配置此主题,它保留了多个副本 我的想法是保持段小,以及所有相关的超时、刷新和保留时间 主题设置(我不太清楚每个选项的应用位置和前缀,因此可能有几个未使用和不相关的选项以及夸大的数字-欢迎更正): 我在这个主题中加入了以下内容: 等待几秒钟后,我数了数消息: var count = 0 val runCount = Consumer .plainSource(consumerSettings, Subscrip

此主题应仅为每个X保存最新的“document X Update”事件。但我无法正确配置此主题,它保留了多个副本

我的想法是保持段小,以及所有相关的超时、刷新和保留时间

主题设置(我不太清楚每个选项的应用位置和前缀,因此可能有几个未使用和不相关的选项以及夸大的数字-欢迎更正):

我在这个主题中加入了以下内容:

等待几秒钟后,我数了数消息:

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日志中看到了段删除—但是每个键仍然有多条消息

如何将卡夫卡主题用作快照存储

使用卡夫卡0.10.2.1


谢谢。

根据Kafka规范:“日志压缩确保Kafka将始终为单个主题分区的数据日志中的每个消息键保留至少上次已知的值”。也就是说,Kafka不保证每个密钥只保留一条消息,但它保证每个密钥始终具有最新的消息版本

您可以尝试处理配置,看看是否可以实现您想要的(请参阅),但我建议在应用程序级别处理它,只使用带有该键的最新消息作为有效消息,因为日志压缩在单独的线程上运行,并且无法在每次更新后触发它(即使有办法,也不会很有效率).

我需要一些细节来调查:1.你能提供代理日志吗?2.代理级别的配置会有所帮助。@SudheshRajan当然,这里是服务器。属性是普通的。我能提供更多信息吗?日志压缩似乎是每个主题中最新的部分为写入而保持打开状态且未压缩的分区(直到该分区滚动并有一个新的分区文件成为写入活动分区)。否则,在压缩周期性地完成运行后,所有其他分区的每个键只能有一条消息。
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) }