У меня есть сервер, который отслеживает данные IoT, и мне нужно сохранить их в базе данных, чтобы я мог создавать какие-то метрики.
Данные принимаются через соединение через веб-сокет, один фрагмент данных может выглядеть примерно так:
{
id: 23,
type: "light"
status: "on"
timestamp: 1607975079
}
Может наблюдаться большой объем данных, и я подумал, что не стоит добавлять каждое событие в базу данных в режиме реального времени, поскольку это может вызвать узкие места.
Существуют ли стратегии для сценариев такого типа, когда я могу использовать какой-либо буфер в памяти, а затем сохранять фрагмент данных в базе данных каждые 30 минут?
Это разумный подход или есть другие способы справиться с этим?
Мы ценим любые предложения.
Спасибо
Вы можете создать буфер и добавлять туда события. Когда накопится определенное количество событий, загрузите буфер в базу данных.
Псевдокод:
const buffer = [];
event.on('event', data => {
buffer.push(event);
if (buffer.length === 10) {
DataBase
.bulkCreate(buffer);
buffer = [];
}
});
Или вы можете использовать Cron:
const buffer = [];
event.on('event', data => {
buffer.push(event);
};
const job = () => {
DataBase
.bulkCreate(buffer);
buffer = [];
};
cron.schedule('*/30 * * * *', () => {
job();
}).start();
Вы можете использовать Redis в качестве буфера и создать отдельный рабочий процесс для массового сохранения данных из буфера в базу данных.
Идея показана в приложении для голосования Docker: https://github.com/dockersamples/example-voting-app
Вы можете создать все компоненты в node.js, примите во внимание, что языковая смесь в приведенном выше примере демонстрирует возможности Dockers.