如何在NodeJS中以正确的顺序传递消息?

问题描述 投票:2回答:1

我部署了一个节点服务器,它的工作是更新物联网设备连接状态的数据库。

问题

  • 由于NodeJS是异步执行的,而且是单线程的,我们假设我收到的状态是这样的 DisconnectedConnected 同时进行。
  • 有时发生的情况是,由于NodeJS是异步的。Connected 先被处理,而 Disconnected 得到下一个处理。
  • 这使得我的数据库处于不一致的状态。

搜索结果

  • 我想按照发生在源头的顺序(即根据时间戳)更新数据库。

那么,如果NodeJS是单线程的,并且每个请求不共享任何内存,我如何实现这一点?

javascript node.js
1个回答
2
投票

我建议,与其保持一个 "连接 "状态的布尔值字段不断地用可能失序的数据更新,不如保持一个连接状态的叙述。

比如说

|----------------------|------------------|------------------|
|      Timestamp       |   IoT DeviceID   |  Connected       |
|----------------------|------------------|------------------|
| 2020-05-01T10:05:00Z |       1234       |  True            |
|----------------------|------------------|------------------|
| 2020-05-01T10:00:00Z |       1234       |  False           |
|----------------------|------------------|------------------|
| 2020-05-01T08:45:00Z |       1234       |  True            |
|----------------------|------------------|------------------|

要得到当前的连接状态,你只需通过设备ID查询,按时间戳排序。

这样就无所谓连接断开事件的顺序了。只要你相信时间戳,连接状态在查询时就会很准确。

查询的内容可能是这样的。

select timestamp, device_id, connected from connection_status order by timestamp desc limit 1;

这样做的好处是,你也有诊断数据 在连接上的故障排除的目的。这可能是非常有用的!

当然,你最终需要清除数据,但你可以通过删除任何超过1个月的数据来做到这一点,例如。


0
投票

不存在这样的问题,它是异步的,不是并发的,因此不存在竞赛条件。先进入的请求要先处理,两个状态不能同时进入。

© www.soinside.com 2019 - 2024. All rights reserved.