【问题标题】:Firestore 500+ Writes Per Second to One CollectionFirestore 每秒 500+ 次写入到一个集合
【发布时间】:2019-09-13 01:51:53
【问题描述】:

Firestore 限制为 每秒 500 次写入到

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

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

在哪些情况下,我可以将 ONE 集合中的每秒写入次数限制增加到 10,000 次?

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

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

例如我在每个文档中的唯一字段如下。

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

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

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

C) 如果文档包含一个顺序字段,but I turn off indexing 到字段 B 中的日期怎么办?

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

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

(然后每次向此集合中的任何文档添加随机字段时都会发生这种情况,因此必须关闭对集合中每个可能字段的索引以消除 500ps 限制?)

【问题讨论】:

    标签: database firebase google-cloud-platform google-cloud-firestore autoscaling


    【解决方案1】:

    每秒 500 次写入是对单个服务器可以处理的保守估计。由于 Cloud Firestore 对文档和索引存储进行水平行分片;这意味着使用顺序 ID 编写的文档或顺序添加的索引条目将由单个服务器处理。将这些放在一起(每台服务器 500 次写入 + 由 1 台服务器处理的顺序更新)就是给你的限制。

    当您拥有分布良好的数据时,我们的水平行分片可以将工作负载拆分到多个服务器中。对于原生模式的 Cloud Firestore,这将一直有效,直到您达到我们实时系统的上限,即大约 10K 写入/秒。对于 Datastore 模式的 Cloud Firestore,没有实际限制,只要您提个醒(客户可以超过 1M 写入/秒)

    简而言之,A) 和 C) 将受到模式上限(10K 或可用容量)的限制。 B) 将受到单个服务器可以处理的负载的限制。

    对于 C2),如果您只是将其添加到单个文档中,则不会有任何影响。该限制纯粹基于传入负载及其分配到的服务器。

    【讨论】:

    • 谢谢丹,非常有帮助。感谢您参考哪些场景将受到哪些因素的限制。
    【解决方案2】:

    对于社区:Firestore 更新了他们的文档,以包含更多关于为什么每秒写入 500 次限制的详细信息,以及如何克服它的建议解决方案。

    https://firebase.google.com/docs/firestore/solutions/shard-timestamp

    解决方案

    1. 在timestamp 字段旁边添加一个shard 字段。对分片字段使用 1..n 不同的值。这会将集合的写入限制提高到 500*n,但您必须聚合 n 查询。
    2. 更新您的写入逻辑,为每个文档随机分配一个 shard 值。
    3. 更新您的查询以聚合分片结果集。
    4. 禁用shard 字段和timestamp 字段的单字段索引。
    5. 删除包含timestamp 字段的现有复合索引。 创建新的复合索引以支持您更新的查询。 索引中字段的顺序很重要,shard 字段必须在时间戳字段之前。 包含timestamp 字段的任何索引也必须包含shard 字段。李>

    警告(未在文档中突出显示)

    他们没有在文档中明确指出,但分片可能会增加您必须执行的读取次数。正如您在第 1 步中看到的,您必须跨分片进行聚合。

    例如在示例中有3 分片,限制为5。查询最多返回15 文档,但您只需要5。所以它在最后将其切回到5。

    如果您有 [10] 个分片(每秒 5000 次写入)并且希望限制为 [50],这将特别成问题。当您只需要 [50] 时,您将在 [500] 文档中进行聚合。

    了解限制顺序索引字段的写入

    顺序索引字段的写入速率限制来自 Cloud Firestore 如何存储索引值和扩展索引写入。为了 每个索引写入,Cloud Firestore 都会定义一个键值条目 连接文档名称和每个索引字段的值。 Cloud Firestore 将这些索引条目组织成数据组 叫tablets。每个 Cloud Firestore 服务器拥有一个或多个 tablets。 当特定tablet 的写入负载变得过高时,云 Firestore 通过将tablet into smaller tabletsand spreading the newtablets` 拆分到不同的 Cloud Firestore 来水平扩展 服务器。

    Cloud Firestore 将按字典顺序关闭的索引条目放在 同样tablet。如果tablet 中的索引值靠得太近, 例如对于时间戳字段,Cloud Firestore 无法高效拆分 将tablet 变成更小的tablets。这会创建一个热点,其中 单tablet接收流量太大,读写操作 到热点变慢了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多