Ошибки и предложения

В этом разделе вы можете проголосовать за идеи по открытым проектам. Вы всегда можете предложить свою идею, перейдя на страницу проекта.

Спасибо!

Мы очень рады, что Вам нравится данный проект и вы проголосовали за его развитие.

Работа над задачами по проекту отнимает у его разработчика самое ценное — время, так что небольшая компенсация в виде материальной поддержки поднимет интерес к разработке и позволит сделать больше задач для общей пользы :)

Перейти к проекту Нет, спасибо

<<< Назад

Feature request: transient свойства объектов

Добавлено: 2023-12-29 00:04:10 / Статус: Новая / Проект: Разработка ядра системы MajorDoMo

https://github.com/sergejey/majordomo/issues/1105

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

Use case:
имеется источник данных, который генерирует большое количество данных в единицу времени. В моём случае это mqtt обновления приходящие каждую секунду с более чем двумя десятками входных значений (go-e charger + controller). Если я регистрирую все параметры и привязываю к свойствам моего объекта(-ов), получаю большое количество обращений к БД. Ситуация усугубляется если есть необходимость хранить историю. Т.к. для истории достаточно хранить показания беря усредненные значения за последнюю минуту, то решением "в лоб" было по ежеминутному таймеру брать getHistoryAvg(-1 minute) и писать результат в другое свойство с более длинной историей. Это уменьшило количество данных в базе, но увеличило количество обращений к базе (ежесекундная запись, после ежеминутный рассчет среднего по последним шестидесяти значениям). В итоге убрав все лишнее, и оставив только самое необходимые свойства, имею >300 запросов к БД.

В качестве обходного решения, я завёл отдельные свойства без истории (назвал xxxBuffer), но пишу в них массив данных - при поступлении нового значения в исходное свойство, вызывается метод, который добавляет в конец xxxBuffer'а новое значение. А по таймеру, раз в минуту высчитывается среднее значение из массива xxxBuffer, и результат записывается в xxx свойство (которое уже с историей в базе). После чего xxxBuffer очищается. Скорость работы значительно возросла, однако по-прежнему каждую секунду происходит обновление:

  1. исходного свойства, которое привязано к mqtt
  2. промежуточного xxxBuffer
    Если в распоряжении появится transient-свойства, то значительно уменьшится количество записей в базу.

+1
 
Обсуждение (8)