Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 过滤后的Akka流kafka提交偏移量_Scala_Akka Stream_Akka Kafka - Fatal编程技术网

Scala 过滤后的Akka流kafka提交偏移量

Scala 过滤后的Akka流kafka提交偏移量,scala,akka-stream,akka-kafka,Scala,Akka Stream,Akka Kafka,我试图在akka流中为偏移量制定至少一次提交策略,但我无法理解我在流中使用过滤器的情况下的预期模式 我的期望是,没有一条经过过滤的消息会得到它们的偏移量,因此它们最终将进入一个无限的处理循环 abasurd的一个示例说明了这一点,它过滤所有消息,如下所示: Consumer.committableSource(consumerSettings, Subscriptions.topics("topic1")) .filter(_ => false) .mapAsync(3)(_.commit

我试图在akka流中为偏移量制定至少一次提交策略,但我无法理解我在流中使用过滤器的情况下的预期模式

我的期望是,没有一条经过过滤的消息会得到它们的偏移量,因此它们最终将进入一个无限的处理循环

abasurd的一个示例说明了这一点,它过滤所有消息,如下所示:

Consumer.committableSource(consumerSettings, Subscriptions.topics("topic1"))
.filter(_ => false)
.mapAsync(3)(_.committableOffset.commitScaladsl()) 
.runWith(Sink.ignore)
我只能看到将过滤器包装在流中的解决方案,这些流检查在这种情况下逻辑是否会过滤掉并提交,但这似乎并不优雅,而且会降低过滤器形状的价值


过滤不是一件稀罕的事情,但我看不到任何提交偏移量的优雅方式?对我来说,似乎很奇怪,框架无法做到这一点,那么我缺少什么呢?

我无法用当前的akka实现找到一个更智能的索引提交解决方案,因此,我已将责任委托给kafka在kafka级别设置自动提交,并将其与应用程序的优雅关闭策略相结合,以便在蓝色/绿色部署发生时,在应用程序关闭之前处理所有消息

  • 自动提交为真:
val consumerSettings=consumerSettings(系统、新ByteArraydSerializer、新StringDeserializer)
.WithBootstrapServer(“本地主机:9092”)
.withGroupId(“group1”)
.withProperty(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,true)
  • 正常关机:
val-actorMaterializer=actorMaterializer(
ActormatarializerSettings(系统)
scala.sys.addShutdownHook{
Actormatarializer.system.terminate()文件
等待结果(Actormatarializer.system.whenTerminated,30秒)
}

遇到了完全相同的问题。目前还没有解决方案,但也希望“过滤器”能够满足您的期望。我想解决方案是将自动提交设置为
true
,但这目前不是我们的选项,因为我们不存储偏移量。在我的情况下,hello@JoostdenBoer是一样的。在任何情况下,我在第二次自动提交中也会回答我的问题,它在卡夫卡级别起作用,所以设置为true应该很好。我们最终会将此操作与优雅的关机操作相结合,因此aws/linux会发送kill信号,它将等待当前的actor materializer完成任何正在进行的工作。很有趣,但我正在考虑另一种解决方案n、 我一直在研究RestartSource实现,想知道这是否是一种创建可恢复源的方法,它将导致错误的所有事件放在一个死信类型的主题上,包括一些元数据,如时间戳、哪个服务、错误等,以便稍后进行分析。或者,不是在流中使用CommittableItem(它包装了偏移量和一个值“T”),使用类似于Try的东西,最终任何失败都可以恢复,但也有原始事件和偏移量要提交。但就我们而言,这仍在进行中。我还有一些功能要提供。;-)所以CommittableItem是我解决这个问题的第一个方法,我看到的问题是任何删除项目的操作(过滤器、主管等)将不得不提交索引,这将使其变得笨重,并且没有大容量容量,这将使其也无法运行。而且,对于我来说,RestartSource似乎更适合rabbitMQ之类的东西,而不是kafka,因为kafka已经有了基于提交偏移量的重试机制。通常,从某种角度来看,akka似乎有一个限制我的讽刺似乎卡夫卡溪是一个更先进的一点在这个主题。