是否可以使用 BASE-fashioned 数据库实现 Exacly Once Semantics?

问题描述

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

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

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

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

解决方法

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

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

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

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