首页 > 解决方案 > 如何在应用程序重启时维护 Alpakka/Akka Streams 源状态?

问题描述

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

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

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

我知道,如果someSource是 Kafka 源或 Kinesis 源或其他一些有状态的源,他们可以跟踪他们的偏移量或检查点,并或多或少地在他们离开的地方重新启动。

然而,许多其他来源没有这样的概念,例如 Cassandra 来源、File 来源或 RDBMs 来源。例如,如果我关闭并重新启动rdms 示例中提供的代码,它每次都会从顶部重新启动。

我是否正确理解没有开箱即用的机制来解决这个问题,我们必须手动处理它?我会想象这个功能会很受欢迎,以至于它会以某种方式处理。如果不是,人们通常如何解决这个问题?您是否使用 Akka 持久性将一些游标存储在几个演员中?或者您是否将原点偏移与输出数据一起存储并在启动时重新读取?

还是我以错误的方式看待这一切?

标签: scalaakkaakka-streamalpakka

解决方案


由于您建议的原因,这是一个非常普遍需要的功能。

然而,实现这一点的唯一通用、可靠的方法是使用 akka 持久性,这可能是 Akka 生态系统中最重的(例如,它需要选择数据库)依赖项。除此之外,它将在某种程度上特定于源。一些(例如 Kafka、Kinesis)有一种方法可以在几乎所有情况下都符合要求,但对于其他人来说,如何存储消费状态的细节会有很多差异的意见。Akka 和 Alpakka 通常倾向于回避意见。


推荐阅读