Действительно ли транзакция требуется в распределенном счетчике? - PullRequest
0 голосов
/ 14 января 2019

По данным пожарного магазина Документация :

транзакция - это набор операций чтения и записи для одного или нескольких документов.

Также:

Транзакции не будут выполнены, когда клиент находится в автономном режиме.

Теперь в пожарном магазине есть ограничение:

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

Поэтому использование облачных функций и выполнение транзакций для увеличения / уменьшения счетчиков при высоком трафике не удастся.

Итак, они обсудили использование подхода распределенных счетчиков .

По алгоритму распределенного счетчика:

  • создание осколков
  • случайным образом выбирает осколок
  • запустить транзакцию , чтобы увеличить / уменьшить счетчик
  • получить все осколки и собрать результат для отображения значения счетчика

Scenerio:
Учтите, что у вас есть счетчик, который должен обновляться при добавлении документа, и этот счетчик отображается в пользовательском интерфейсе. Теперь для хорошего UX я не могу заблокировать пользовательский интерфейс, когда сеть отключена. Поэтому я должен разрешить создание / обновление документов, даже когда клиент находится в автономном режиме, и синхронизировать эти изменения, когда клиент находится в сети, чтобы все остальные, слушающие эти изменения, получили правильное значение счетчика.

Теперь транзакции не выполняются, когда клиент находится в автономном режиме. Поэтому мой вопрос для лучшего пользовательского опыта (даже в автономном режиме) :

  1. Действительно ли вам требуется транзакция для увеличения счетчика ? я знаю транзакции гарантируют, что записи являются атомарными и успешный / неудачный и предотвратить частичные записи. Но что это точка, когда они терпят неудачу в автономном режиме? Я подумал, может быть, записать их в локальный кэш и синхронизировать его, как только сеть снова подключится.

  2. Должно ли это быть сделано через sdks клиента или через облачные функции?

1 Ответ

0 голосов
/ 14 января 2019

Вам действительно требуется транзакция для увеличения счетчика?

Определенно, да! Поскольку мы создаем приложения, которые можно использовать в многопользовательской среде, транзакции являются обязательными, поэтому мы можем предоставлять согласованные данные.

Но какой смысл, когда они выходят из строя в автономном режиме?

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

Должно ли это быть сделано через клиентские sdks или через облачные функции?

Обратите внимание, что Firestore SDK для Android имеет локальный кэш , который включен по умолчанию. Согласно официальной документации о Firestore офлайн-персистенция :

Для Android и iOS автономное сохранение включено по умолчанию. Чтобы отключить постоянство, установите для параметра PersistenceEnabled значение false.

Таким образом, все операции чтения будут поступать из кэша, если на сервере нет обновлений. Поэтому Firestore предоставляет эту функцию для обработки автономных данных.

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

Я также рекомендую вам взглянуть:

Так что вы можете также рассмотреть возможность использования базы данных Firebase в реальном времени для этого. Облачная база данных Firestore и Firebase в реальном времени работают очень хорошо вместе.

Edit:

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

Это также происходит по умолчанию. Поэтому, если пользователь пытается добавить / удалить документы в автономном режиме, каждая операция добавляется в очередь. Как только пользователь восстановит соединение, все изменения, сделанные в автономном режиме, будут обновляться на серверах Firebase. Другими словами, все запросы будут отправлены на сервер.

Функции облака запускаются только при получении изменения, и это может происходить только при подключенном устройстве.

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

Edit2:

Предположим, я произвел около 100 операций в автономном режиме, не будет ли это загружать функции облака, когда устройство подключится к сети? Что вы думаете об этом?

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

Что касается облачных функций для этих 100 автономных операций, проблем не будет. Серверы Firebase очень хорошо работают с параллельными операциями.

...