Firebase Firestore分布式计数器:如何知道我们需要的理想碎片总数?

Firebase Firestore分布式计数器:如何知道我们需要的理想碎片总数?,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,TL;DR:这里有没有数学方法来预测我应该使用多少碎片作为计数器? 我非常喜欢计数器(是的,这很奇怪),我正在写一个小的民意测验应用程序 我有计数器集合,其中每个文档都是计数器,每个计数器都有碎片的子集合 <root_level> ├── [counters] │ └── counterID │ ├── num_shards: 20 │ └── [shards] │ ├── 1 │ │ └── counts: 2

TL;DR:这里有没有数学方法来预测我应该使用多少碎片作为计数器?

我非常喜欢计数器(是的,这很奇怪),我正在写一个小的民意测验应用程序

我有计数器集合,其中每个文档都是计数器,每个计数器都有碎片的子集合

<root_level>
├── [counters]
│   └── counterID
│       ├── num_shards: 20
│       └── [shards]
│           ├── 1
│           │   └── counts: 2
│           ├── 2
│           │   └── counts: 7
│           └── 3...
├── [votes]
    └── voteId
        ...
在我的客户机中,我合并了两个观察值:一个用于计数器,另一个用于它的相关碎片子集合,我使用一个基本的reduce()来求和总计数

combineLatest(counter$, shards$)
      .pipe(
        map(([counter, shards]) => {
          const count = shards.reduce(
            (acc: any, shards: any) => shards.count + acc,
            0
          )

          return { ...counter, count }
        })
      )
      .subscribe(counter => /* display counter */)
我用5、10、15个碎片和1000张选票做了几次测试,结果发现数据争用错误。但是有了100个碎片,我没有出错。但这似乎是一个掷硬币游戏。事实上,有时候它只需要很少的碎片,有时候我需要更多的碎片

因此,我的问题是:这里是否有数学公式可以准确预测我应该使用多少碎片作为计数器?我希望以最低的成本获得最佳的性能


您需要预测最大负载,并根据该负载进行切分。文档可以处理持续的写入,而不会生成拒绝写入的错误。因此,如果您想每秒处理50次写操作,则需要至少50个文档进行切分,前提是写操作完全分布在这些文档之间。如果您不想假设完美的分发,请选择更高的级别,以减少单个文档因写入而承受过大压力的可能性


如果您不能提前知道最大负载,那么您将无法优化要使用的文档碎片的数量。在这种情况下,您需要任意调高,并希望它能满足您的实际需求。

我正在使用firebase,感觉firebase并不是移动应用程序(如实时计数器)的完整解决方案@Doug建议,50个文档碎片,但成本非常高。总的来说,firebase成本高昂+不是完整的解决方案。据我所知,Firebase不包含一些必要的功能,包括计数器(写入限制)、实时搜索、随机文档等。我认为,所有这些功能都非常基本。Firebase的替代方案是什么?
combineLatest(counter$, shards$)
      .pipe(
        map(([counter, shards]) => {
          const count = shards.reduce(
            (acc: any, shards: any) => shards.count + acc,
            0
          )

          return { ...counter, count }
        })
      )
      .subscribe(counter => /* display counter */)