Firestore限制
每秒 500次写入”一个集合,其中文档包含一个 索引字段”
https://cloud.google.com/firestore/quotas#writes_and_transactions
假设我使用Best Practices来保持文档ID在整个密钥范围内相对均匀地分布。
A)如果文档不包含任何顺序值怎么办?
例如我在每个文档中仅有的字段如下。
B)如果文档包含一个顺序字段,但我从未按该字段查询怎么办?
C)如果文档包含一个连续字段,but I turn off indexing到字段B中的日期呢?
C)第2部分-如果我关闭了对该日期字段的索引编制(这消除了每秒500个的限制),如果我将Collection C随机添加到集合中的SINGLE文档中会发生什么情况?拥有一个带有字段C的文档是否会破坏对集合的每秒10,000写限制?因为现在Firestore不得不担心任何新的Field C的自动索引?
(然后,每当您向此集合中的任何文档中添加一个随机字段,是否每次都要关闭索引到集合中每个可能的字段以消除500ps的限制时,这种情况就会发生吗?)
答案 0 :(得分:1)
500次写入是单个服务器可以处理的保守估计。由于Cloud Firestore对文档和索引存储都进行水平行分片;这意味着使用顺序ID编写的文档或顺序添加的索引条目将由单个服务器处理。将这些内容放在一起(每台服务器500次写入+由1台服务器处理的顺序更新)可以为您提供限制。
当您具有良好分布的数据时,我们的水平行分片可以将工作负载拆分为许多服务器。对于本机模式下的Cloud Firestore,这将一直有效,直到您达到实时系统的上限,即大约10K次写入/秒。对于Datastore模式下的Cloud Firestore,没有实际限制,只要您给我们提神(客户可以超过每秒100万次写入)
简而言之,A)和C)将受到模式上限(10K或可用容量)的限制。 B)将受到单个服务器可以处理的负载的限制。
对于C2),如果仅将其添加到单个文档中,则不会有任何影响。该限制完全基于传入的负载以及将负载分配给哪些服务器。
答案 1 :(得分:0)
对于社区:Firestore 更新了他们的文档,以更详细地说明每秒写入次数限制为 500 的原因,以及有关如何克服该限制的建议解决方案。
https://firebase.google.com/docs/firestore/solutions/shard-timestamp
shard
字段旁边添加一个 timestamp
字段。对分片字段使用 1..n
不同的值。这会将集合的写入限制提高到 500*n
,但您必须聚合 n
查询。shard
值。shard
字段和 timestamp
字段的单字段索引。timestamp
字段的现有复合索引。
创建新的复合索引以支持更新的查询。 索引中字段的顺序很重要,shard
字段必须在时间戳字段之前。任何包含 timestamp
字段的索引还必须包含 {{1 }} 字段。他们没有在文档中明确指出,但是分片可能会增加您必须执行的读取次数。正如您在第 1 步中看到的,您必须跨分片聚合。
例如在示例中有 shard
个分片,限制为 3
。查询最多返回 5
个文档,但您只需要 15
。所以它在最后将它切回到 5
。
如果您有 [10] 个分片(每秒 5000 次写入)并且希望限制为 [50],这将尤其成问题。当您只需要 [50] 时,您将跨 [500] 个文档进行聚合。
顺序索引字段的写入速率限制来自
Cloud Firestore 如何存储索引值和缩放索引写入。为了
每次索引写入,Cloud Firestore 都会定义一个键值条目,该条目
连接文档名称和每个索引字段的值。
Cloud Firestore 将这些索引条目组织成数据组
称为 5
。每个 Cloud Firestore 服务器都拥有一个或多个 tablets
。
当特定 tablets
的写入负载变得过高时,Cloud
Firestore 通过将 tablet
tabletstablet into smaller
tablets` 拆分到不同的 Cloud Firestore 来水平扩展
服务器。
Cloud Firestore 将按字典顺序关闭的索引条目放在
相同的and spreading the new
。如果 tablet
中的索引值靠得太近,
例如对于时间戳字段,Cloud Firestore 无法有效拆分
将 tablet
变成更小的 tablet
。这会产生一个热点,在那里
单个tablets
接收流量过多,读写操作
到热点变得更慢。
通过分片时间戳字段,您可以让 Cloud
Firestore 可有效地跨多个 tablet
拆分工作负载。
尽管时间戳字段的值可能保持接近
连接的分片和索引值一起为 Cloud Firestore
索引条目之间有足够的空间来将条目拆分为多个
tablets
。