Вам действительно требуется транзакция для увеличения счетчика?
Определенно, да! Поскольку мы создаем приложения, которые можно использовать в многопользовательской среде, транзакции являются обязательными, поэтому мы можем предоставлять согласованные данные.
Но какой смысл, когда они выходят из строя в автономном режиме?
В случае потери сетевого подключения (нет сетевого подключения на пользовательском устройстве), транзакции не поддерживаются для автономного использования. Это связано с тем, что транзакция обязательно требует двусторонней связи с сервером, чтобы обеспечить успешное завершение кода внутри транзакции. Таким образом, транзакции могут выполняться только когда вы находитесь в сети.
Должно ли это быть сделано через клиентские sdks или через облачные функции?
Обратите внимание, что Firestore SDK для Android имеет локальный кэш , который включен по умолчанию. Согласно официальной документации о Firestore офлайн-персистенция :
Для Android и iOS автономное сохранение включено по умолчанию. Чтобы отключить постоянство, установите для параметра PersistenceEnabled значение false.
Таким образом, все операции чтения будут поступать из кэша, если на сервере нет обновлений. Поэтому Firestore предоставляет эту функцию для обработки автономных данных.
Вы также можете написать функцию в облачной функции, которая будет увеличивать счетчик при добавлении нового документа или уменьшать значение conter при удалении документа.
Я также рекомендую вам взглянуть:
Так что вы можете также рассмотреть возможность использования базы данных Firebase в реальном времени для этого. Облачная база данных Firestore и Firebase в реальном времени работают очень хорошо вместе.
Edit:
Позволяет поднять ответ, даже если устройство не в сети. После подключения к сети она синхронизируется с сервером, и счетчик обновляется. Есть ли способ, которым я могу сделать это в firestore, когда устройство находится в автономном режиме.
Это также происходит по умолчанию. Поэтому, если пользователь пытается добавить / удалить документы в автономном режиме, каждая операция добавляется в очередь. Как только пользователь восстановит соединение, все изменения, сделанные в автономном режиме, будут обновляться на серверах Firebase. Другими словами, все запросы будут отправлены на сервер.
Функции облака запускаются только при получении изменения, и это может происходить только при подключенном устройстве.
Да, это правильно. Как только устройство восстанавливает сетевое соединение, документ добавляется / удаляется из базы данных, в тот момент, когда функция запускает и увеличивает / уменьшает счетчик.
Edit2:
Предположим, я произвел около 100 операций в автономном режиме, не будет ли это загружать функции облака, когда устройство подключится к сети? Что вы думаете об этом?
В автономном режиме ожидающие записи, которые еще не были синхронизированы с сервером, удерживаются в очереди. Если вы выполняете слишком много операций записи, не выходя в интернет для их синхронизации, эта очередь будет быстро расти и не будет замедлять только операции записи, а также будет замедлять ваши операции чтения. Поэтому я предлагаю использовать эту базу данных для своих онлайн-возможностей.
Что касается облачных функций для этих 100 автономных операций, проблем не будет. Серверы Firebase очень хорошо работают с параллельными операциями.