Документ Firestore "Слишком много разногласий": такая вещь в базе данных реального времени? - PullRequest
0 голосов
/ 09 января 2020

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

В часы пик этот документ обновляется довольно часто (возможно, 10 раз в секунду). Иногда транзакции с этим документом элемента терпят неудачу из-за того, что «слишком много конфликтов», что приводит к неточной статистике, поскольку обновление статистики прекращается. Я предполагаю, что это является результатом высокой нагрузки на документ.

Чтобы решить эту проблему, я рассматриваю возможность перемещения статистики элементов из документа элемента в firestore в базу данных в реальном времени. Прежде чем я сделаю это, я хочу быть уверенным, что это действительно решит проблему, возникшую у меня с конфликтом в моем документе. Может ли база данных в реальном времени справиться с такой нагрузкой лучше, чем документ пожарного депо? Считается ли хорошей практикой перемещение таких данных в базу данных в реальном времени?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

В часы пик этот документ обновляется довольно часто (возможно, 10x в секунду). Иногда транзакции в этот документ элемента не выполняются из-за того, что «слишком много конфликтов»

Это происходит потому, что Firestore не может обработать такую ​​скорость. Согласно официальной документации о квотах на записи и транзакции :

Максимальная скорость записи в документ: 1 в секунду

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

Чтобы решить эту проблему, я рассматриваю возможность перемещения статистики элементов из документа элемента в Firestore в базу данных реального времени.

Это решение, которое я даже использую для таких случаев.

В соответствии с официальной документацией относительно использования и ограничений в базе данных Firebase Realtime , таких ограничений нет. Но вам решать, подходит ли он вашим потребностям или нет.

Есть еще одна вещь, которую вам нужно учитывать, а именно распределенный счетчик . Это может решить вашу проблему наверняка.

2 голосов
/ 09 января 2020

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

База данных реального времени имеет другие задокументированные ограничения . Измеряется в общем объеме данных, записанных в всю базу данных. Это ограничение составляет 64 МБ в минуту . Если вы хотите перейти в базу данных реального времени, пока вы находитесь под этим лимитом, у вас должно быть все в порядке.

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

Что касается того, является ли какой-либо из них "хорошей практикой", это вопрос мнения, который не подходит топи c для переполнения стека. Делайте все, что работает для вашего варианта использования. Я слышал о людях, успешно использующих любой из них.

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