Как сохранить состояние с помощью Cloud Functions и Cloud FIrestore - PullRequest
0 голосов
/ 12 июня 2018

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

Вот последовательность событий:

  1. Документ обновлен currentState: state1
  2. Документ обновлен currentState: state2
  3. Облачная функция запускает обновление state2.
  4. Облачная функция запускает обновление state1.

Если вашприложение требует выполнения функций в правильном порядке состояний, есть проблема.

1 Ответ

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

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

Вы можете решить эту проблему следующим образом:

  1. Всегда используйте транзакции для обновления состояния, чтобы 2 клиента не пытались изменитьодновременное состояние.
  2. Создание таблицы состояний, которая управляет состоянием и выполняет функции на основе текущего состояния в сравнении с предыдущим состоянием.
  3. Клиенты не должны изменять состояние на значениеменьше того, что существует в настоящее время.

states.json

[
  {"currentState": "state1", "action": "state2", "newStates": ["state2"]},
  {"currentState": "state1", "action": "state3", "newStates": ["state2", "state3"]},
  {"currentState": "state1", "action": "state4", "newStates": ["state2", "state3", "state4"]},
  {"currentState": "state1", "action": "state5", "newStates": ["state2", "state3", "state4", "state5"]},
  {"currentState": "state2", "action": "state3", "newStates": ["state3"]},
  {"currentState": "state2", "action": "state4", "newStates": ["state3", "state4"]},
  {"currentState": "state2", "action": "state5", "newStates": ["state3", "state4", "state5"]},
  {"currentState": "state3", "action": "state4", "newStates": ["state4"]},
  {"currentState": "state3", "action": "state5", "newStates": ["state4", "state5"]},
  {"currentState": "state4", "action": "state5", "newStates": ["state5"]}
]

app.js

function processStates (beforeState, afterState) {
  const states = require('../states');
  let newStates;

  // Check the states and set the new state
  try {
    newStates = states.filter(function(e) {return e.currentState == beforeState && e.action == afterState;})[0].newStates;
  }
  catch (err) {
    newStates = null;
  }

  console.log(`newStates: ${newStates}`);

  if (newStates) {
    newStates.forEach(newState) {
      // Process state change here
      switch (newState) {
        case 'state1': {
          // Process state1 change
          break;
        }
        case 'state2': {
          // Process state2 change
          break;
        }
        default: {
        }
      }
    }
  }
}

Если у вас есть массив состояний, вы можетеитерируйте, используя что-то вроде forEach или map для обработки необходимых команд.

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