Могут ли транзакции Firebase когда-нибудь ошибаться? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть приложение, которое позволяет пользователям голосовать 5 раз в день.Каждый голос передается на узел votes.У меня есть облачная функция onCreate, слушающая votes, которая запускает несколько транзакций, каждая из которых просто увеличивает один из нескольких узлов tally/total, tally/users/{userId} и т. Д.

Проверяются функция голосования и onCreate.и работает как ожидалось.

Вчера мы развернули в производство, и я запустил запрос на tally/users, чтобы узнать, нашел ли кто-нибудь способ голосовать более 5 раз в день.И, конечно же, два пользователя были отмечены как проголосовавшие 6 раз в первый день.Поэтому я сделал запрос к фактическому узлу votes и обнаружил, что эти пользователи на самом деле подали только 5 голосов.Итак ... мои транзакции не сработали правильно для двух из 5000 пользователей.

В нашем случае нам не нужны эти счетчики, чтобы быть супер точными, но в чем же дело?Я что-то упускаю в транзакциях с Firebase или на них действительно нельзя рассчитывать?(каламбур)

Не смейся над моей плохо структурированной БД ...

exports.allVotesOnCreate = functions.database
  .ref('/votes/all/{pushId}')
  .onCreate(
    (snapshot, context) => {
      const vote = snapshot.val();
      const { date, userId, uid } = vote;

      return Promise.all([
        // removed other transactions for brevity
        ref(`tally/all/total`)
          .transaction(value => 
            value ? value + 1 : 1
        ),
        ref(`tally/user/byDate/${userId}/${date}`)
          .transaction(value =>
            value ? value + 1 : 1
        ),
      ]).catch(err => {
        console.error(`Error tallying vote ${uid}`, err);
      });
    }
  );

Я ожидал, что количество голосов в votes за конкретного пользователя по конкретномудата будет соответствовать их подсчету в tally/user/byDate/{userId}/{date}, но есть небольшое количество случаев, когда подсчет равен 6, когда фактическое количество голосов составляет 5.

Я мог бы даже ожидать, что подсчет может быть меньше, чемФактическое количество голосов, если транзакция как-то провалилась, но больше?как?

1 Ответ

0 голосов
/ 26 сентября 2019

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

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