【问题标题】:Is it possible to achieve Exacly Once Semantics using a BASE-fashioned database?是否可以使用 BASE-fashioned 数据库实现 Exacly Once 语义?
【发布时间】:2021-04-26 20:15:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: database apache-flink spark-streaming event-stream-processing exactly-once


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复。对于简单的用例,我可以遵循您的论点。但我一直在思考更复杂的场景。什么是接收器或其他操作员将(中间)结果写入数据库而其他操作员(管道中的早期或后期)读取此数据的用例。像这样的东西可以处理吗?通过在数据库中保存窗口 ID 或实施其他方法来保持同步?
    • 如果您在谈论是否可以将中间数据与另一个运算符隔离,答案是否定的,因为 Nosql 数据库不执行“事务”,因为这些是阻塞操作,这不是它们的设计为了。但是一些 NoSql 数据库(例如 cassandra)仍然支持原子更新的批处理语句,但性能不佳。一般来说,运营商使用相同的密钥更新数据以避免冲突。但在更复杂的情况下,您只需要仔细建模您的数据结构并规划您的操作以使它们保持同步。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2018-04-15
    • 2021-06-26
    • 2011-03-27
    相关资源
    最近更新 更多