应用场景如下:接收物联网传感器数据,周期大概一秒,设备量200左右。前端需要展示200个设备的实时状态(数值、状态、数据采集时间等),同时需要将上报的数据存储到历史数据库。目前已实现方案,接收数据处理和设备基础信息管理(webapi)为同一个程序,使用静态变量维护最新的实时数据,同时定期(每5秒)将期间缓存的数据写入历史数据库。
遇到的问题:由于数据采集和数据展示在同一个应用里,导致只是更新webapi(设备基础信息维护)的功能都要停整个服务才行。数据采集部分基本不会存在停的可能,耦合度太高了。针对此情况,想要把数据采集部分和webapi(设备基础信息维护)分离成两个应用,数据采集用于搜集硬件设备数据,webapi用户展示设备实时数据、历史日志查询、设备基础信息维护、权限管理等。这里就会牵涉到实时数据同步的问题,如何将采集到的实时数据同步到webapi中。采集程序写库webapi再从数据库读取,效率太低了,后续设备量再增加,扛不住。使用分布式缓存redis,涉及到两边数据更新同步,双方如何通知对方更新到最新的数据
多个应用如何更新和访问缓存数据
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 清水白石008 2024-08-06 12:27关注
将数据采集部分和 Web API 分离成两个应用是一个合理的架构设计,可以降低耦合度,提高系统的可维护性和扩展性。针对您提到的实时数据同步问题,以下是一些建议和方案:
1. 使用消息队列
使用消息队列(如 RabbitMQ、Kafka、Redis Pub/Sub 等)可以有效地实现数据采集和 Web API 之间的解耦。具体步骤如下:
- 数据采集程序:
- 在接收到传感器数据后,将数据发送到消息队列中。
- Web API:
- 订阅消息队列,实时接收数据采集程序发送的数据,并更新 Redis 缓存或直接更新数据库。
这种方式可以确保数据的实时性,同时避免了直接的数据库写入,提升了系统的性能。
2. 使用 Redis 作为缓存
在数据采集程序中,将实时数据存储到 Redis 中,Web API 直接从 Redis 中读取数据。具体实现如下:
数据采集程序:
- 将实时数据写入 Redis,使用设备 ID 作为键,实时数据作为值。
Web API:
- 从 Redis 中读取实时数据进行展示。可以设置一个定时任务,定期将 Redis 中的数据写入历史数据库。
3. 数据更新通知机制
为了确保数据的一致性,可以考虑实现一个数据更新通知机制:
数据采集程序:
- 在将数据写入 Redis 后,发送一个更新通知(可以是通过消息队列或 HTTP 请求)给 Web API,告知其数据已更新。
Web API:
- 接收到更新通知后,可以选择从 Redis 中读取最新数据,或者直接更新其内部状态。
4. 定期同步与补偿机制
为了处理可能出现的数据丢失或延迟,可以实现定期同步机制:
定期同步:
- Web API 可以定期从历史数据库中读取数据,更新 Redis 中的缓存,以确保数据的完整性。
补偿机制:
- 如果 Web API 在某个时间段内未能接收到数据更新通知,可以设计一个补偿机制,定期检查 Redis 中的数据与历史数据库的数据是否一致,并进行必要的更新。
5. 监控与日志
为了确保系统的稳定性和可维护性,建议实现监控和日志记录:
监控:
- 监控数据采集程序和 Web API 的运行状态,确保它们正常工作。
日志:
- 记录数据采集和更新的日志,以便于后续的故障排查和性能分析。
总结
通过使用消息队列和 Redis 作为缓存,可以有效地实现数据采集和 Web API 之间的解耦和实时数据同步。同时,定期同步和补偿机制可以确保数据的一致性和完整性。这样的架构设计将有助于提高系统的可扩展性和性能,适应未来设备量增加的需求。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 - 数据采集程序:
悬赏问题
- ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
- ¥50 浦育平台scratch图形化编程
- ¥20 求这个的原理图 只要原理图
- ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
- ¥20 微信的店铺小程序如何修改背景图
- ¥15 UE5.1局部变量对蓝图不可见
- ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
- ¥20 sentry如何捕获上传Android ndk 崩溃
- ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
- ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?