Должно ли приложение NodeJS быть чисто без сохранения состояния, чтобы его можно было реплицировать? - PullRequest
0 голосов
/ 29 апреля 2020

В моем приложении Node есть значения, которые пользователь может определить. Эти значения после их создания могут изменяться как из-за действия, инициируемого пользователем, так и из чего-то еще, например, из сообщения MQTT, полученного на сервере. Значение может изменяться очень редко или несколько раз в секунду.

class Value {
  constructor(valueStore, id, name) {
    this.valueStore = valueStore;
    this.id = id;
    this.name = name;
  }
  // ...
}

Поскольку некоторые значения могут изменяться много раз в секунду, я не сохраняю значения в MongoDB Atlas каждый раз, когда они меняются (затраты на передачу данных довольно дорого). Вместо этого у меня есть «ValueStore», который по сути является глобальным объектом, где все мои значения хранятся с их текущим значением. Если мое приложение закрывается, я сохраняю содержимое хранилища ValueStore в Atlas каждые 5 секунд, что намного дешевле.

// This is a global object
class ValueStore {
  constructor() {
    this.values = [];
    this.bufferUpdateInterval = setInterval(() => {
      // Every 5s, save values in ValueStore collection
    }, VALUES_UPDATE_DB_FREQUENCY);
  }

  setValue(value) {
     this.value = value;
  }
  // ...
}

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

// When my app starts:
const initializeValueStore = async (streams, variables) => {
  const values = await Values.getLastValues(); // call to get the last known Values
  for (let i = 0; i < values.length; i++) {
      const lastKnownValue = // ...
      valueStore.addValue(valueStore, values[i].id, values[i].name, lastKnownValue);
    }
  }

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

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

...