产品定价 立即试用
云平台
欧洲地区
指南 > Tutorials > Basics > Using queues for synchronization
入门 文档
API 常见问题
目录

使用队列进行同步

应用场景

假设您需要使用ThingsBoard规则引擎实现“计数器”逻辑。 由于消息处理在规则节点内部异步执行,大多数情况下,“获取当前计数值 -> 加上新计数值 -> 保存计数值”这种逻辑会因竞态条件而产生与预期不符的错误结果。 这是多线程编程中常见的问题。您可参考这篇文章了解该问题及现有解决方案。 自ThingsBoard v2.5起,可通过可配置队列解决该处理问题。

在本教程中,我们将配置ThingsBoard规则引擎,使用具有“按来源顺序提交”消息策略的队列。 尽管该场景为虚构示例,您将学习如何使用队列实现消息顺序处理,并在实际应用中运用该知识。

前置条件

我们假定您已完成以下指南并阅读了所列文章:

此外,您需要在环境中至少预置一个设备。

步骤1:创建规则链

Rule chain image

我们将添加两个生成器节点,每个生成七条消息。第一个生成器将产生计数值为101的消息。 第二个生成器产生计数值为10的消息。因此最终结果应为777。

First generator image Second generator image

两条消息都将放入 SequentialByOriginator 队列。该队列使用消息提交策略 SEQUENTIAL_BY_ORIGINATOR,即基于来源实体的后续消息将在前一条消息被确认(处理完成并从队列删除)后开始处理。

我们使用 originator attributes 节点获取当前“计数器”值。当前禁用“若任一属性缺失则告知失败”,因为设备可能尚不具备所需属性,启用会导致错误。 该属性将在第一条消息到达 save attributes 节点后设置到设备。 Originator attributes node image

使用 script 节点执行计算。

Script node image

最后一步是使用 save attributes 节点保存新的计数值。

Save attributes node image

步骤2:验证规则链逻辑

保存规则链以验证我们的逻辑是否正确。生成器将自动产生14条消息:

Events image

持久化到设备的最终计数值为:

Device attributes image

这说明我们的逻辑正确无误。

快速总结

下载并导入本教程附带的规则链JSON 文件。 别忘了在生成器节点中填写您的具体设备。

下一步