我正在尝试为akka流中的偏移量设置一个至少一次的提交策略,而且我无法理解我在流上使用过滤器的情况的预期模式。
我的期望是,所有过滤后的消息都不会得到它们的偏移量,因此它们最终将处于无限循环处理中。
一个犹豫不决的例子就是过滤所有这样的消息:
Consumer.committableSource(consumerSettings, Subscriptions.topics("topic1"))
.filter(_ => false)
.mapAsync(3)(_.committableOffset.commitScaladsl())
.runWith(Sink.ignore)
我只能看到在流程中包含我的过滤器的解决方案,检查逻辑是否会在这种情况下过滤掉并提交,但这看起来并不优雅,并且会减少过滤器形状的值。
过滤并不是一件罕见的事情,但是我看不出有任何提供偏移的优雅方式?对我而言,框架无法做到这一点似乎很奇怪,所以我错过了什么?
答案 0 :(得分:0)
我无法找到当前akka实现的解决方案,以便更加智能地提交索引,因此我已将责任委托给kafka级别的kafka设置自动提交,并将其与优雅的关闭策略相结合对于应用程序,所以当蓝色/绿色部署发生时,所有消息都在应用程序关闭之前进行处理。
val consumerSettings = ConsumerSettings(system, new ByteArrayDeserializer, new StringDeserializer)
.withBootstrapServers("localhost:9092")
.withGroupId("group1")
.withProperty(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, true)
val actorMaterializer = ActorMaterializer(
ActorMaterializerSettings(system)
scala.sys.addShutdownHook {
actorMaterializer.system.terminate()
Await.result(actorMaterializer.system.whenTerminated, 30.seconds)
}