开箱即用的数据缓存服务|EMQX Cloud 影子服务应用场景解析

简介: 通过EMQX Cloud影子服务提供的平台数据缓存能力,用户可以更加便捷地实现各类物联网场景应用,缩短研发周期。

在物联网业务高速迭代的今天,快速连接物联网设备与平台应用,实现业务快速落地与市场验证,是很多企业塑造核心竞争力、实现业务创新的关键。

EMQX Cloud 作为一站式运维代管的 MQTT 消息云服务,可以帮助用户在公有云环境中快速实现物联网应用对接。为了进一步帮助用户快速搭建物联网业务,EMQX Cloud 近期推出了影子服务功能。通过影子服务提供的平台数据缓存能力,用户可以更加便捷地实现各类场景应用,缩短研发周期。

什么是影子服务

在物联网设备与应用的消息交互场景中,设备侧网络不稳定、低功耗设备休眠、移动端应用不定期消费数据等情况十分常见。对于物联网应用开发者来说,更需要数据生产与消费解耦的数据交互模型。因此 MQTT 作为基于发布/订阅的异步通讯协议在物联网场景中被广泛应用。为了进一步保证数据交互的可靠性,在 MQTT 消息接入层提供对设备最新上报消息与应用下发配置等数据的缓存与持久化就成为物联网平台设计中的一个重要需求。

EMQX Cloud 基于已有的 MQTT消息接入服务,在增值服务中增加了影子服务(Shadow Service)功能,提供开箱即用的平台侧数据缓存服务。用户可以在 EMQX Cloud 内置服务中完成设备上报数据缓存、修改、查看,快速创建物模型、设备影子以及其他和数据上报及下发相关的应用,无需自己购买外部资源以及复杂的配置实现数据缓存服务。

  1. 用户可以在一个 EMQX Cloud 专业版实例中创建多个影子服务。每个影子服务创建后会生成一个全局唯一的 shadow_id,用户可以通过基于 shadow_id 的固定上下行 MQTT 主题以及 RestAPI 来创建、修改、删除不同缓存服务中的数据;
  2. 缓存数据以 JSON 文档的格式存储在影子服务中,用户在创建,修改缓存文档时,影子服务会自动为 JSON 文档添加创建/修改的时间戳以及更新文档版本,方便文档消费者确认信息。对每一个影子服务我们只保存最新的版本的数据;
  3. 影子服务提供 MQTT 与 RestAPI 两种接口来对缓存文档进行增删改查的操作,方便 MQTT 设备与应用服务调用;
  4. 影子服务提供的 MQTT 接口完全适配标准 MQTT 协议,客户端只要符合标准 MQTT 协议即可调用影子服务,无需定制化的 SDK,也没有平台绑定。

应用场景示例

我们以智能家居场景为例来详细解释如何使用影子服务。在智慧家居场景中,最常见的应用是通过智能家居设备-云端服务-个人移动 APP 之间的数据互动,实现 APP 设备状态的上报更新以及对设备的远程控制。利用影子服务,我们可以非常简单地实现一个智能设备控制应用,以智能空调为例:

空调温度状态上报

1.在 EMQX Cloud 中为智能空调设备创建一个影子服务,影子服务为此设备创建唯一的 shadow_id 和固定的发布订阅主题
EMQX Cloud 添加影子模型 图1.png

2.智能空调设备通过 MQTT 协议将空调内置温度传感器数据定时上报到影子服务指定的发布主题 shadow/8suy0g7pp08ibdtc 中,首次上报数据 Payload 使用 PUT 操作:

3.

   {
     "method": "PUT",
     "payload": {
       "status":{
         "temp":26
         }
     }
   }

这时在影子服务中就可以看到一个新的数据被缓存下来:

影子模型 图2.png

这里面我们可以看到除了设备上报的空调温度 JSON 文档以外,影子服务也为这份文档自动添加了:

  • createAT:文档创建时间;
  • lastTime:文档更新时间;
  • version:文档版本号;

方便后续 APP 对比历史数据和展示数据;

4.智能空调可以以定时上报的方式持续更新影子服务中缓存的温度数据,在 MQTT payload 中使用 PATCH 方法进行数据更新:

{
  "method": "PATCH",
  "payload": {
    "status":{
      "temp":24
    }
  }
}

影子服务中的缓存数据即被更新为:

影子模型 JSON 图3.png

5.当用户打开手机 APP 想查看空调运行情况与室内温度时,APP 可以通过 MQTT 或 RestAPI 接口,从影子服务缓存中获取到最新的状态数据。以 MQTT 方式为例,APP 打开后会与 EMQX Cloud 服务建立一个 MQTT 连接,通过订阅主题 shadow/8suy0g7pp08ibdtc/reply 获取设备消息;

6.如果此时空调数据没有上报,可以通过向影子服务的发布主题 shadow/8suy0g7pp08ibdtc 发送一个 GET 指令来拉取缓存中的最新状态:

{
  "method": "GET",
  "payload": {
  }
}

影子服务收到此消息后,就会将缓存中的数据返回给 APP:

{
  "data": {
    "status": {
      "temp": 24
    }
  }, 
  "createAt": 1661365033203, 
  "lastTime": 1661365569334, 
  "version": 2
}

7.如果 APP 持续在线,当有新的空调温度状态上报到影子服务中时,由于 APP 已经订阅了 shadow/8suy0g7pp08ibdtc/reply 主题,最新的状态数据就会推送到 APP 中。这样,一个动态更新的空调温度展示业务就可以轻松完成。

APP 远程调节空调温度

如果我们希望能从 APP 调节空调温度,同时保留空调设备状态上报功能。

  1. 我们需要在 JSON 文档中增加一个键值,如通过 PATCH 命令增加 desired:
  2. {
      "method": "PATCH",
      "payload": {
        "desired":{
        }
      }
    }

    此时 JSON 文档变为:

    {
      "data":{
        "desired":{},
        "status":{
          "temp":24
        }
      },
      "createAt":1661365033203,
      "lastTime":1661366036466,
      "version":3
    }
  3. 同时空调也需要订阅 shadow/8suy0g7pp08ibdtc/reply 主题来接收 APP 的调节指令(当然,也可以为指令下发建立一个新的影子服务,这样就有一个独立的控制下发主题通道);
  4. 然后我们就可以通过 APP 来下发控制指令:

    {
      "method": "PATCH",
      "payload": {
        "desired":{
           "temp":27
        }
      }
    }

    此时 JSON 文档更新为:

    {
      "data": {
        "desired": {
          "temp": 27
        }, 
        "status": {
          "temp": 24
        }
      }, 
      "createAt": 1661365033203, 
      "lastTime": 1661366053663, 
      "version": 4
    }
  5. 当空调通过订阅 shadow/8suy0g7pp08ibdtc/reply 主题收到上面更新的 JSON 文档后,空调客户端程序通过 desired 键内设置的值更新自身温度设定,实现远程 APP 温度控制。

更多应用可能

除了智能家居场景以外,我们还可以利用影子服务的数据缓存功能实现很多业务场景应用:

  1. 低功耗智能表计数据采集与远程配置:在实际生活中很多智能表计设备(如燃气表,水表等)由于依靠电池供电,为了延长电池供电寿命经常会采用休眠的方式来节电。比如入户燃气表一天可能只会唤醒 1-2 次,唤醒时间在几分钟内。通常我们会在唤醒阶段上报表计读数,并同时接收更新平台侧应用对表计的最新配置。此时,我们就可以利用影子服务将平台侧的配置缓存起来,当表计唤醒后拉取最新的配置数据进行更新。这样平台应用在下发配置的时候也不需要探察表计设备是否在线,简化了应用逻辑。
  2. 车联网车机消息推送:在车联网场景中,车机在熄火的情况下是处在休眠状态。而车联网平台部分消息通知(保养提醒、运营消息通知等)可以利用影子服务的缓存功能实现对离线车机设备的消息缓存。当车辆发动车机唤醒后,通过拉取影子服务中的缓存消息实现离线消息的同步更新。

结语

EMQX Cloud 提供的开箱即用的影子服务可以适配不同行业各类型业务场景对数据缓存的需求。通过 EMQX Cloud 提供的全托管 MQTT 消息云服务,结合影子服务功能,用户可以快速实现 MQTT 设备接入与消息缓存的一体化能力,大大加快物联网应用开发速度。同时,影子服务中灵活的消息缓存数据结构,也可以帮助用户轻松实现后期业务的扩展,为用户业务持续发展提供保障。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/emqx-cloud-shadow-service-application-scenario

目录
相关文章
|
3月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
344 57
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
存储 缓存 监控
一次缓存引发的文件系统数据不一致问题排查与深度解析
本文详述了一次由自研分布式文件系统客户端 EFC 的缓存架构更新所引发的严重数据不一致问题的完整排查过程。
一次缓存引发的文件系统数据不一致问题排查与深度解析
|
7月前
|
弹性计算 运维 安全
优化管理与服务:操作系统控制平台的订阅功能解析
本文介绍了如何通过操作系统控制平台提升系统效率,优化资源利用。首先,通过阿里云官方平台开通服务并安装SysOM组件,体验操作系统控制平台的功能。接着,详细讲解了订阅管理功能,包括创建订阅、查看和管理ECS实例的私有YUM仓库权限。订阅私有YUM仓库能够集中管理软件包版本、提升安全性,并提供灵活的配置选项。最后总结指出,使用阿里云的订阅和私有YUM仓库功能,可以提高系统可靠性和运维效率,确保业务顺畅运行。
|
2月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
244 0
|
5月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
210 32
|
5月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
170 4
|
4月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
170 0
|
7月前
|
机器学习/深度学习 人工智能 缓存
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
MHA2MLA是复旦大学、华东师范大学、上海AI Lab等机构联合推出的数据高效微调方法,通过引入多头潜在注意力机制(MLA),显著优化基于Transformer的LLM推理效率,降低推理成本。
239 1
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
|
6月前
|
缓存 NoSQL Go
【LeetCode 热题100】146:LRU 缓存(详细解析)(Go语言版)
本文详细解析了力扣 146 题——LRU 缓存机制的实现方法。通过结合哈希表与双向链表,确保 `get` 和 `put` 操作均在 O(1) 时间内完成。哈希表用于快速查找,双向链表记录访问顺序,支持最近使用数据的高效更新与淘汰。代码以 Go 语言实现,结构清晰,涵盖核心操作如节点移动、插入与删除。此题为面试高频考点,适用于数据缓存、页面置换等场景,掌握后可加深对缓存策略的理解。
309 4

推荐镜像

更多
  • DNS