Понимание рекомендованной Firestore максимальной скорости отправки клиента 1 документ / секунду - PullRequest
0 голосов
/ 27 октября 2019

Контекст

Моя команда создает виртуальный книжный клуб следующего поколения в реальном времени (не совсем, но это упрощает фактическое использование моего приложения) с Firestore.

Когда пришло времясобравшись в книжном клубе, пользователи присоединятся к своему книжному клубу и проголосуют, какие книги они хотели бы прочитать дальше. Книжные клубы, как правило, имеют от 10 до 15 пользователей, и каждый клуб имеет тенденцию голосовать за 25-30 книг. Каждый пользователь может отдать свой голос за любое количество книг. Эти сеансы голосования в книжном клубе длятся около 3-4 минут и вовлекают всех пользователей клуба, которые проголосовали в этот период времени.

Текущая архитектура Firestore

Моя структура данных выглядит следующим образом:

  • bookClubs (коллекция)
    • bookClub1 (документ)
      • books (сборник)
        • book1 (документ)
        • book2 (документ)
        • ...
        • bookX (документ), где X обычно <30 </li>
      • пользователей (коллекция)
        • user1 (документ))
        • user2 (документ)
        • ...
        • userY (документ), где Y обычно <15 </li>
    • bookClub2 (document)
      • ...

Голоса хранятся в массиве карт в документе книгигде каждая карта содержит uid пользователя, имя и другие метаданные. Каждый из пользователей книжного клуба ожидает изменений, используя snapshotChanges() в документе bookClubX, вместе с коллекцией вложенных книг и коллекцией вложенных пользователей.

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

Ограничения

В процессе разработки казалось, что с клубами, которые имеют 3-4 пользователя и голосуют 8-12, все идет хорошо. книг. Вчера вечером у нас состоялось первое настоящее собрание настоящих книжных клубов с 15 пользователями и примерно 30-35 книгами, и вещи разбились и сгорели . Устройства перестали отвечать на запросы, мобильные веб-браузеры начали падать, и данные стали синхронизироваться.

После закрытия собрания книжного клуба и необходимости печально голосовать старой бумагой и ручкой наша команда разработчиков вернулась к чертежуСовет, чтобы понять, где что-то могло не получиться.

В документации Firestore мы встретили следующую рекомендуемую лучшую практику:

Сохраняйте скорость документов, которые база данных отправляет отдельному клиенту. до 1 документа / секунду.

В нашем случае каждый пользователь, который присоединяется к документу bookClubZ и звонит snapshotChanges(), должен сбросить документ bookClubZ вместе с каждым документом book иuser документ в двух bookClubZ вложенных коллекциях. Это составляет 1 bookClubZ doc + 30 book docs + 15 user docs = ~ 46 документов, которые читаются при инициализации для каждого клиента пользователя книжного клуба, не говоря уже о каждом обновлении, которое происходит, когда пользователь читаетголосование за книгу.

Мы уже опередили возможности Firestore? Похоже, что мы грубо нарушили рекомендуемую лучшую практику, описанную выше. Этот сценарий лучше подходит для чего-то вроде Socket.io, PubNub, Ably и т. Д.? Является ли наша структура данных Firestore тупой и неэффективной?

1 Ответ

0 голосов
/ 27 октября 2019

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

Ограничение, которое вы указываете, относится к записи пропускной способности в один документ. Таким образом, вы можете (в среднем) писать один раз в каждый документ в секунду. Это на самом деле сложнее, чем это, и связано с индексами, которые Firestore придется обновлять, и с тем фактом, что все данные передаются в несколько центров обработки данных, прежде чем операция будет считаться завершенной. Но 1 запись на документ в секунду является хорошей консервативной оценкой, которую следует учитывать при проектировании структуры данных.

Firestore не будет аварийно завершать работу, если вы превысите этот предел;Ваши записи будут просто стоять в очереди, пока сервер не сможет их обработать.

Это просто краткое объяснение лимита, который вы цитируете. Невозможно сказать, что испытали ваши пользователи, не увидев минимальный код , который мы можем использовать для его воспроизведения . Мой первый вопрос был бы: есть ли у вас бесплатный план , и если да, проверьте, сколько раз произошло чтение документов. Довольно просто собрать данные для чтения на пользователя с наивной структурой данных, и Firestore перестанет работать, если вы достигнете предела квот вашего проекта / плана.

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