我部署了一个节点服务器,它的工作是更新物联网设备连接状态的数据库。
问题
Disconnected
和 Connected
同时进行。Connected
先被处理,而 Disconnected
得到下一个处理。搜索结果
那么,如果NodeJS是单线程的,并且每个请求不共享任何内存,我如何实现这一点?
我建议,与其保持一个 "连接 "状态的布尔值字段不断地用可能失序的数据更新,不如保持一个连接状态的叙述。
比如说
|----------------------|------------------|------------------|
| 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个月的数据来做到这一点,例如。
不存在这样的问题,它是异步的,不是并发的,因此不存在竞赛条件。先进入的请求要先处理,两个状态不能同时进入。