У меня есть приложение, которое позволяет пользователям голосовать 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.
Я мог бы даже ожидать, что подсчет может быть меньше, чемФактическое количество голосов, если транзакция как-то провалилась, но больше?как?