Распределенные счетчики Firestore: Как узнать, какая идеальная сумма осколков нам нужна? - PullRequest
0 голосов
/ 16 апреля 2019

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 осколками я не получил ошибок.Но похоже, что это игра с монетами.На самом деле, иногда это просто работает с несколькими осколками, иногда мне нужно больше осколков.

Итак, мой вопрос: Есть ли здесь математика, чтобы точно предсказать, сколько осколков я должен использовать для своих счетчиков? Я хотел бы иметь лучшую производительность при минимальных затратах.

Data contention errors

1 Ответ

1 голос
/ 16 апреля 2019

Вы должны предсказать, какой будет ваша максимальная нагрузка, и раскалывать в соответствии с этой нагрузкой.Документ может обрабатывать длительную 1 запись в секунду без создания ошибки, которая отклоняет запись.Итак, если вы хотите иметь возможность обрабатывать 50 записей в секунду, вам потребуется как минимум 50 документов для разделения между ними, при условии, что записи идеально распределены между ними.Если вы не хотите принимать идеальное распространение, увеличьте вероятность того, что один документ будет перегружен записями.

Если вы не знаете свою максимальную загрузку заранее, значит, вы выигралине сможет оптимизировать количество осколков документов для использования.В этом случае вам нужно подняться как можно выше и надеяться, что это соответствует вашим реальным потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...