Firestore每秒可写入500多个集合

时间:2019-04-23 20:05:13

标签: google-cloud-firestore

Firestore限制

每秒 500次写入
  

”一个集合,其中文档包含一个   索引字段”

https://cloud.google.com/firestore/quotas#writes_and_transactions

在什么情况下我可以将一个集合中的限制提高到每秒10,000次写入?

假设我使用Best Practices来保持文档ID在整个密钥范围内相对均匀地分布。

A)如果文档不包含任何顺序值怎么办?

例如我在每个文档中仅有的字段如下。

  • 字段A:随机字符串
  • 字段B:随机字符串

B)如果文档包含一个顺序字段,但我从未按该字段查询怎么办?

  • 字段A:随机字符串
  • 字段B(顺序):日期

C)如果文档包含一个连续字段,but I turn off indexing到字段B中的日期呢?

  • 字段A:随机字符串
  • 字段B(顺序):日期(自动索引关闭)

C)第2部分-如果我关闭了对该日期字段的索引编制(这消除了每秒500个的限制),如果我将Collection C随机添加到集合中的SINGLE文档中会发生什么情况?拥有一个带有字段C的文档是否会破坏对集合的每秒10,000写限制?因为现在Firestore不得不担心任何新的Field C的自动索引?

(然后,每当您向此集合中的任何文档中添加一个随机字段,是否每次都要关闭索引到集合中每个可能的字段以消除500ps的限制时,这种情况就会发生吗?)

2 个答案:

答案 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

解决方案

  1. shard 字段旁边添加一个 timestamp 字段。对分片字段使用 1..n 不同的值。这会将集合的写入限制提高到 500*n,但您必须聚合 n 查询
  2. 更新您的写入逻辑,为每个文档随机分配一个 shard 值。
  3. 更新您的查询以聚合分片结果集。
  4. 禁用 shard 字段和 timestamp 字段的单字段索引。
  5. 删除包含 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 通过将 tablettabletstablet into smaller tablets` 拆分到不同的 Cloud Firestore 来水平扩展 服务器。

Cloud Firestore 将按字典顺序关闭的索引条目放在 相同的and spreading the new。如果 tablet 中的索引值靠得太近, 例如对于时间戳字段,Cloud Firestore 无法有效拆分 将 tablet 变成更小的 tablet。这会产生一个热点,在那里 单个tablets接收流量过多,读写操作 到热点变得更慢。

通过分片时间戳字段,您可以让 Cloud Firestore 可有效地跨多个 tablet 拆分工作负载。 尽管时间戳字段的值可能保持接近 连接的分片和索引值一起为 Cloud Firestore 索引条目之间有足够的空间来将条目拆分为多个 tablets