0

在流处理应用程序(基于 Apache Flink 或 Apache Spark Streaming 的 fe)中,有时需要只处理一次数据。

在数据库世界中,通过使用遵循 ACID 标准的数据库可以实现相同的目标(如果我在这里错了,请纠正我)。

但是有很多(非关系)数据库不遵循 ACID 而是遵循 BASE。

现在我的问题是:如果我要将这样的 BASE 数据库集成到流处理应用程序中(仅一次),我还能保证对整个管道进行一次处理吗?如果这是可能的,在什么情况下?

4

1 回答 1

1

Exactly Once Semantics 意味着 flink 之类的处理框架可以保证每个传入的记录(事件)将被处理一次,即使 pineline 以任何方式失败。

这是通过在 pineline 中的每个操作之后设置检查点来完成的,这样当应用程序从失败中恢复时,将不会再次执行成功的操作。

取决于您尝试对数据库执行哪种操作,大多数情况下数据库用作接收器以处理要写入的结果。在这种情况下,涉及数据库的操作只是一个简单的插入,并且在一次成功运行后不会再次执行,因此无论其 ACID 支持如何,它仍然只是一次。

您可能很想将支持 ACID 的数据库的操作组合在一起,但在并行流式 pineline 中这将是一个不好的做法,因为它们创建了多个事务并且锁可能会阻塞整个过程。相反,最好使用具有密集读取和更新性能的快速 BASE (NoSQL) 数据库,您只需要使您的操作是幂等的,以便部分重新执行的语句(如果它们在中途失败,那么在恢复后它们可能会再次执行)不会导致错误的数据。

于 2021-04-26T12:15:41.020 回答