Почему мой параметр функции оценивается по-разному во время транзакции Firebase? - PullRequest
0 голосов
/ 29 июня 2018

В моем коде облачных функций firebase:

return num_picks_ref.transaction(function(cur_num_picks) {
  console.log(`cur_num_picks: ${cur_num_picks}`)
  console.log(`cur_num_picks <= 0: ${cur_num_picks <= 0}`)
  if (cur_num_picks <= 0) { 
      console.error(`user ${uid} is submitting picks too fast, reached negative pick balance.`)
    }
  return cur_num_picks - 1
})

Тогда в выходных логах я получаю:

12:46:35.519 PM ---- db_positions_decrementPickCount ---- cur_num_picks: 87
12:46:35.420 PM ---- db_positions_decrementPickCount ---- user KtY8U5e1p8MCJDOFW2eEuLW5DO83 is submitting picks too fast, reached negative pick balance.    
12:46:35.416 PM ---- db_positions_decrementPickCount ---- cur_num_picks: null

Я понимаю, что транзакции могут вызываться несколько раз, чтобы гарантировать атомарную запись, но это единственный код, модифицирующий cur_num_picks в среде. Нигде больше это значение не изменяется в БД реального времени.

Кажется, что функции не запускаются в указанном порядке, что не имеет смысла для меня.

Самое главное, cur_num_picks оценивается как 87 в первой строке, но не 87 снова в следующей строке. Как это может быть?

1 Ответ

0 голосов
/ 29 июня 2018

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

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

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