В моем приложении 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 войти в игру?