如何将实时数据存储到数据库?

How to store real time data to a database?

我有一台观察物联网数据的服务器,我需要将其存储到数据库中,以便我可以构建某种指标。

正在通过 websocket 连接接收数据,一条数据可能如下所示:

{
  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作为缓冲区,并创建一个单独的worker来将缓冲区中的数据批量保存到您的数据库中。

这个想法显示在 Docker 投票应用程序中: https://github.com/dockersamples/example-voting-app

您可以构建 node.js 中的所有组件,考虑到上面示例中的语言组合是为了显示 Docker 的能力。