TL; DR: Есть ли здесь математика, чтобы точно предсказать, сколько осколков я должен использовать для своих счетчиков?
Я большой поклонник счетчиков (да, это странно)и я пишу небольшое приложение для опросов.
У меня есть коллекция счетчики , где каждый документ представляет собой счетчик , а каждый счетчик имеет подколлекцию shards .
<root_level>
├── [counters]
│ └── counterID
│ ├── num_shards: 20
│ └── [shards]
│ ├── 1
│ │ └── counts: 2
│ ├── 2
│ │ └── counts: 7
│ └── 3...
├── [votes]
└── voteId
...
Кроме того, я настроил облачную функцию для отслеживания любого нового добавленного голос документа в коллекции голос .Эта функция получает случайный ID шарда и увеличивает его ... как в примере в документации.
const counterRef = db.doc('counters/counter')
export const onVote = functions.firestore
.document('votes/{voteId}')
.onCreate(async snapShot => {
const counterDoc = (await counterRef.get())
const { num_shards } = counterDoc.data()
const shard_id = Math.floor(Math.random() * num_shards).toString()
const shard_ref = counterRef.collection('shards').doc(shard_id)
return db.runTransaction(async tsx => {
const shardDoc = (await tsx.get(shard_ref))
const oldCount = shardDoc.data().count
return tsx.update(shard_ref, { count: oldCount + 1 })
})
})
И в моем клиенте я объединил две наблюдаемые: одну для счетчика и одну для связаннойподколлекция осколков, и я делаю простое уменьшение () для суммирования общего количества.
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 осколками я не получил ошибок.Но похоже, что это игра с монетами.На самом деле, иногда это просто работает с несколькими осколками, иногда мне нужно больше осколков.
Итак, мой вопрос: Есть ли здесь математика, чтобы точно предсказать, сколько осколков я должен использовать для своих счетчиков? Я хотел бы иметь лучшую производительность при минимальных затратах.