ApacheFlink—是否可以使用一个基础数据库来实现ExacleOnce语义?

vh0rcniy  于 2021-07-15  发布在  Flink
关注(0)|答案(1)|浏览(384)

流内处理应用程序(f。e。基于apache flink或apache spark streaming),有时需要只处理一次数据。
在数据库世界中,通过使用遵循acid标准的数据库(如果我在这里错了,请纠正我)可以实现一些相同的功能。
然而,有许多(非关系)数据库不遵循acid而是遵循base。
现在我的问题是:如果我要将这样一个基础数据库集成到流处理应用程序中(只集成一次),我还能保证整个管道只进行一次处理吗?如果这是可能的,在什么情况下?

xv8emn3q

xv8emn3q1#

精确一次语义意味着处理框架(如flink)可以保证每个传入的记录(事件)将被精确处理一次,即使pineline以任何方式失败。
这是通过在pineline中的每个操作之后设置检查点来完成的,这样当应用程序从失败中恢复时,成功的操作就不会再次执行。
取决于您试图对数据库执行何种操作,大多数情况下,数据库都用作处理结果的接收器,以便写入。在这种情况下,涉及数据库的操作只是一个简单的插入,在一次成功运行后不会再次执行,因此无论其acid支持如何,它仍然只执行一次。
您可能会尝试将支持acid的数据库的操作组合在一起,但在并行流pineline中这将是一个糟糕的做法,因为它们创建了多个事务,并且锁可能会阻塞整个过程。相反,最好使用速度快、读取和更新性能强的base(nosql)数据库,您只需将操作设为幂等,这样部分重新执行的语句(如果它们中途失败,则在恢复之后可能会再次执行)就不会导致不正确的数据。

相关问题