如何在重新启动应用程序时维护Alpakka / Akka Streams源状态?

时间:2019-12-27 17:16:52

标签: scala akka akka-stream alpakka

我是Alpakka的新手,正在考虑将其用于系统集成。在整个应用程序重新启动时维持Akka Streams源状态的理想方法是什么?

例如:假设我使用以下方法来连续读取一些输入数据并将其转储到某处。如果它运行了大约4小时,然后整个JVM崩溃并重新启动(例如k8s重新启动了我的Pod),该怎么办?

someSource
    .via(someTransformation)
    .via(someOtherTransformation)
    .toMap(...)
    .run()

我了解到,如果someSource是Kafka源或Kinesis源或其他有状态源,则他们可以跟踪其偏移量或检查点,并或多或少从中断处重新开始。

但是,许多其他来源都没有这样的概念,例如Cassandra源,文件源或RDBM源。例如,如果我关闭并重新启动rdms example中提供的代码,则每次都会从顶部重新启动。

我正确地理解,没有机制可以立即解决这个问题。我们必须手动处理吗?我曾想过,此功能会如此普遍,以某种方式处理。如果没有,人们通常如何解决?您是否使用Akka持久性将一些游标存储在几个actor中?还是将原点偏移量与输出数据一起存储并在启动时重新读取?

还是我看错了这一切?

1 个答案:

答案 0 :(得分:1)

出于您建议的原因,这是非常需要的功能。

但是,实现此目标的唯一通用,可靠的方法是使用akka持久性,它可能是Akka生态系统中最重的依赖(例如,它需要选择数据库)。除此之外,它将是特定于源的。有些工具(例如Kafka,Kinesis)可以做到这一点,几乎可以在每种情况下使用,但对于另一些情况,如何存储消费状态的细节会有所不同的意见。一般来说,Akka和Alpakka倾向于回避意见。