首页 > 解决方案 > Firestore :维护集合的计数。触发函数 vs 事务

问题描述

假设我有一个名为的集合persons和另一个名为citiesfield的集合population。在 aPerson中创建 aCity时,我想增加 population相应城市中的字段。

我有两个选择。

  1. 创建onCreate触发函数。使用查找city文档和增量FieldValue.increment(1)

  2. 创建一个 HTTPS 可调用云函数来创建人员。云功能执行一个交易,其中创建了人并增加了人口。

第一个更简单,我现在正在使用它。但是,我想知道是否存在onCreate由于某些故障而没有调用的情况......

我正在考虑转向第二种选择。我想知道是否有任何缺点。HTTPS 可调用函数是否成本更高?

标签: firebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


我看到的 HTTPS 可调用对象的唯一问题是,如果出现故障,您需要在客户端处理该问题。对于客户端来说,这将是(至少对我而言)有点多的逻辑。

在解决该问题近 4 年的经验之后,我可以向您推荐的是一个虚拟的解决方案queue我在这里就这个主题进行了长时间的讨论,甚至在最后一次 Google IO 和 Firebase 峰会上与 Firebase ppl 进行了讨论。

我们的问题是这些故障在那里,即使它们发生有时由于请求过多而导致更改和事务失败。在尝试了计数器等所有官方建议之后,shard我们最终创建了一个虚拟queue,每个都onCreate将一个条目添加到一个 Firestore 或 RTD 列表/集合和另一个由crone或另一个触发器运行的函数(没关系)。该云功能queue一个一个地处理每个条目,并为每个条目重新启动,以避免超时和内存限制。我们确保一个处理程序/计算足以让单个函数处理它。

这种方法是唯一一种可以在一秒钟内处理数千个新条目而不会出现问题的防弹方法。唯一的缺点是它比通常的触发器需要更多的时间,因为每个条目都是一个一个计算的。如果您的计算较小,您可以分批进行(这就是我们开始的方式)。


推荐阅读