【发布时间】:2019-12-23 19:58:06
【问题描述】:
我有一个关于 Firestore 规则评估的两部分问题。这些部分是相关的,这就是为什么这里只有一个问题......
第一部分 - 原子写访问
假设我有一个书面规则,例如
allow write: if resource.data.claimedBy == null && request.data.claimedBy == request.auth.uid;
这个想法是任何用户都可以对该资源提出声明。但是,如果这个资源同时提供给 1000 个用户,并且他们都跳起来提出声明并同时拨打.update() 电话,该怎么办?
这会是第一次获胜的场景吗? Firebase 将被设置为第一个用户(获胜者)的字段,然后其他所有人的写入都将被拒绝,因为规则会由于获胜者的写入中存在的值而失败?或者是否存在任何可能导致竞争条件的风险,并且不知何故,值是一回事,然后变成另一回事?
我觉得规则会禁止比赛条件,但我不确定。
第二部分 - 写入限制
好的,所以这部分建立在第一部分的基础上。 Firestore 对单个文档的写入限制通常为 1 次写入/秒。让我们假设第 I 部分按我希望的方式工作,而其他 999 名用户将收到写拒绝。这些拒绝是否因为已启动写入而计入 1 写入/秒的写入限制,还是因为规则禁止实际写入而不计入?
显然,将所有这些声明尝试同时计为 1000 次写入对于 1 次写入/秒的限制是不利的。
我在这里假设,但我相信它不会计入该限制,因为我的理解是该限制是由底层存储机制的性质强加的,并且规则阻止在拒绝时进入该层。但同样,我不确定。
第三部分 - 奖励部分
就计费而言,被规则拒绝的写入是否仍算作“写入”?我知道对不存在的文档的查询(没有实际读取的文档)仍然算作一次读取,所以我想知道关于禁止底层写入的规则的写入是否以类似的方式工作并产生费用。
非常感谢!
【问题讨论】:
-
您是否尝试/弄清楚您的规则架构是否保证原子写入?
标签: firebase google-cloud-platform google-cloud-firestore firebase-security