【问题标题】:How to correctly handle idempotency of Firebase Cloud Functions?如何正确处理 Firebase Cloud Functions 的幂等性?
【发布时间】:2019-12-03 16:20:08
【问题描述】:

我已经看过所有这些问题和资源,但都不能满足我的担忧。

Cloud functions and Firebase Firestore with Idempotency

Firebase cloud function idempotency in docs

How to make idempotent aggregation in Cloud Functions?

https://cloud.google.com/functions/docs/bestpractices/retries#make_retryable_background_functions_idempotent

如果一个函数被多次执行并且同时运行,我如何知道另一个函数正在运行并安全地丢弃它?即使我将eventId 写入数据库的某个位置,在我设法写入此类信息之前,其他函数仍有可能运行。

使用 Firestore 事务可以解决这个问题吗?如果我要在事务中写入基于eventId 的文档,是否可以肯定地说在我释放“锁”之前任何其他功能都将保持?

使用.set 的方法对我来说不可行,因为某些函数会为文档生成唯一的 ID,所以我最终还是会多次编写这些 ID。其他一些功能非常精细,可以同时生成(或者更确切地说是转换)一堆文档。

尽管我很喜欢云功能的整体理念,但我希望有更多针对此的内置解决方案。为什么 Firebase 基本上不能满足开发人员的要求?他们可以将eventId 写入一些内部数据库并阻止函数多次运行。强迫每个人自己处理这听起来真的很愚蠢。

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    幂等性很难,并且没有一种正确的方法来实现它。有很多选择,需要考虑不同的情况。最重要的是,并非所有函数都需要是幂等的,因此在所有实现上强制它是昂贵且不必要的。您必须根据函数必须执行的操作做出最佳判断。

    请记住,幂等性与并行性不同。您无需担心函数会同时在同一个事件中被调用两次。无需担心“锁定”任何东西以防止这种情况发生。您需要担心的是确保函数的第二次调用不会做任何不正确的事情,而不是第一次成功调用会做的事情。

    对于大多数函数,只需记录特定事件 ID 成功发生就足够了。未来的调用可以简单地检查事件是否已被处理,如果是,则提前终止。您可以将其存储在任何您想要的地方。如果您愿意,请使用交易,以确保安全。您可能应该将该记录保留至少几个小时。

    请记住,执行多项工作的函数将越来越难以实现幂等性,因为您可能必须记录每个工作阶段是否成功完成。鉴于难度不断增加,最好一个函数只提交一个更改,然后将结果传递给另一个函数,可能通过带有指示接下来应该发生什么的有效负载的 pubsub 触发器。

    如您所见,这并不简单,您必须仔细考虑才能以适合您系统要求的方式处理事情。

    【讨论】:

    • 我看到这是一个重要的认识,即同一事件不会同时发生。谢谢你澄清这一点。对于像我这样不精通术语的人来说,在文档中提及这一点可能会很好。
    猜你喜欢
    • 2018-06-06
    • 2021-08-21
    • 2018-01-02
    • 2018-08-19
    • 2018-09-10
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多