淹没的木马 2024-08-01 17:27 采纳率: 100%
浏览 2
已结题

多个应用如何更新和访问缓存数据

应用场景如下:接收物联网传感器数据,周期大概一秒,设备量200左右。前端需要展示200个设备的实时状态(数值、状态、数据采集时间等),同时需要将上报的数据存储到历史数据库。目前已实现方案,接收数据处理和设备基础信息管理(webapi)为同一个程序,使用静态变量维护最新的实时数据,同时定期(每5秒)将期间缓存的数据写入历史数据库。
遇到的问题:由于数据采集和数据展示在同一个应用里,导致只是更新webapi(设备基础信息维护)的功能都要停整个服务才行。数据采集部分基本不会存在停的可能,耦合度太高了。针对此情况,想要把数据采集部分和webapi(设备基础信息维护)分离成两个应用,数据采集用于搜集硬件设备数据,webapi用户展示设备实时数据、历史日志查询、设备基础信息维护、权限管理等。这里就会牵涉到实时数据同步的问题,如何将采集到的实时数据同步到webapi中。采集程序写库webapi再从数据库读取,效率太低了,后续设备量再增加,扛不住。使用分布式缓存redis,涉及到两边数据更新同步,双方如何通知对方更新到最新的数据

  • 写回答

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 之间的解耦和实时数据同步。同时,定期同步和补偿机制可以确保数据的一致性和完整性。这样的架构设计将有助于提高系统的可扩展性和性能,适应未来设备量增加的需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月17日
  • 已采纳回答 8月9日
  • 创建了问题 8月1日

悬赏问题

  • ¥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驱动,如何解决?