firebase - Firestore :维护集合的计数。触发函数 vs 事务
问题描述
假设我有一个名为的集合persons
和另一个名为cities
field的集合population
。在 aPerson
中创建 aCity
时,我想增加 population
相应城市中的字段。
我有两个选择。
创建
onCreate
触发函数。使用查找city
文档和增量FieldValue.increment(1)
。创建一个 HTTPS 可调用云函数来创建人员。云功能执行一个交易,其中创建了人并增加了人口。
第一个更简单,我现在正在使用它。但是,我想知道是否存在onCreate
由于某些故障而没有调用的情况......
我正在考虑转向第二种选择。我想知道是否有任何缺点。HTTPS 可调用函数是否成本更高?
解决方案
我看到的 HTTPS 可调用对象的唯一问题是,如果出现故障,您需要在客户端处理该问题。对于客户端来说,这将是(至少对我而言)有点多的逻辑。
在解决该问题近 4 年的经验之后,我可以向您推荐的是一个虚拟的解决方案queue
。我在这里就这个主题进行了长时间的讨论,甚至在最后一次 Google IO 和 Firebase 峰会上与 Firebase ppl 进行了讨论。
我们的问题是这些故障在那里,即使它们发生有时由于请求过多而导致更改和事务失败。在尝试了计数器等所有官方建议之后,shard
我们最终创建了一个虚拟queue
,每个都onCreate
将一个条目添加到一个 Firestore 或 RTD 列表/集合和另一个由crone
或另一个触发器运行的函数(没关系)。该云功能queue
一个一个地处理每个条目,并为每个条目重新启动,以避免超时和内存限制。我们确保一个处理程序/计算足以让单个函数处理它。
这种方法是唯一一种可以在一秒钟内处理数千个新条目而不会出现问题的防弹方法。唯一的缺点是它比通常的触发器需要更多的时间,因为每个条目都是一个一个计算的。如果您的计算较小,您可以分批进行(这就是我们开始的方式)。
推荐阅读
- git - 从 2 个尚未在 GitHub 中合并的分支创建一个分支
- python - OsError 10048 每个套接字地址(协议/网络地址/端口)通常只允许使用一次
- string - 删除某些字符/短语 SQLITE 之后的所有内容
- flutter - 如何避免类中的空选项
- css - 考虑到所有行,使弹性项目共享相同的空间
- java - 如何将数据插入 Avro Union/Map 类型
- discord.js - TypeError:无法读取 discord.js 上未定义的属性“0”
- c - C - 线程在等待时无限期卡住
- python - 在 Python 中使用包含在 spark.read() 的 json 文件中的模式
- react-native - React Native 可访问性操作 onSwipe 事件