【问题标题】:Can I create different sets of collections per tenant to avoid contention issues?我可以为每个租户创建不同的集合集以避免争用问题吗?
【发布时间】:2019-08-20 10:37:50
【问题描述】:

我正在考虑将 Google Cloud Firestore 用于多租户应用程序。

我浏览了这个页面,该页面提供了有关比例的建议:https://cloud.google.com/firestore/docs/best-practices#designing_for_scale

还有这个页面显示限制:https://cloud.google.com/firestore/quotas

我想出了这个解决方案,它可以以最少或不增加额外成本来提高应用程序的性能和弹性。

解决方案:我可以在应用程序中为每个多租户集合使用不同的集合,例如:products_1、orders_1、products_2、orders_2。

我想使用它,因为:

1- 它将具有更好的性能,因为我将拥有更小的表/索引。否则从长远来看,它可能包含太多文档。

2- 这是可行的,因为代码与具有名称的集合进行交互,我不必显式创建集合。与使用关系数据库/ORM 组合相比,这似乎不是一个大问题。

3- 我可以使用不同名称创建多少个集合没有限制。

所以我的问题: 我的任何假设是否不正确,以至于它不会在性能方面获得任何收益,或者即使没有记录,创建无限数量的集合也是不可行的。

最后,这种方法是否会造成我目前无法意识到的长期维护问题?

感谢您的宝贵时间。

【问题讨论】:

    标签: google-cloud-firestore database-performance multi-tenant


    【解决方案1】:

    使用单独的集合来分片客户端绝对是提高整体写入吞吐量的一种方法。但是您不需要集合的命名约定。

    相反,我会考虑为所有租户/用户创建一个顶级集合,然后为每个租户/用户文档创建一个子集合。这样一来,每个租户/用户都有一个单独的子集合,但仍然有可预测的集合名称。

    【讨论】:

    • 谢谢@Frank。听起来不错,显然我需要更多经验才能切换到无 sql 心态。我可以安全地假设子集合像常规集合一样执行,并且我不会有导致性能问题的胖顶级文档吗?因为一个文档可能有 30 个子集合,并且在某些时候它们可能会包含一百万个文档。 (顺便说一下,我不考虑超过一级的子文档或集合)
    • 另外,我刚刚在文档中看到,我可以一次性定义复合索引,以涵盖当前和所有可能的未来子集合,这些子集合具有相同的集合 id,这非常好。
    • 子集合完成与您的命名方案相同的操作,但不需要命名方案。 :)
    猜你喜欢
    • 2016-08-23
    • 2018-03-08
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2011-02-09
    • 2011-09-26
    相关资源
    最近更新 更多