ThingsBoard设计为:
下图屏示了系统的关键组件和相关接口。
ThingsBoard传输
ThingsBoard提供了基于MQTT、HTTP 和 CoAP 的API,适用于你的设备应用程序/固件。
每个协议API都是由单独的服务器组件提供的并且是ThingsBoard“传输层”的一部分。
MQTT传输还提供网关API供代表多个已连接设备和/或传感器的网关使用。
传输从设备接收到消息后,它将被解析并推送到持久的消息队列。
仅在消息队列确认了相应消息后才将消息传递给设备。
ThingsBoard核心
ThingsBoard Core负责处理REST API调用和WebSocket 订阅。
它还负责存储有关活动设备会话和监视设备连接状态。
ThingsBoard核心在幕后使用Actor来实现主要实体(租户和设备)的actor。
平台节点可以加入群集其中每个节点负责传入消息的某些分区。
ThingsBoard规则引擎
ThingsBoard规则引擎是系统的心脏负责处理传入的 消息。
规则引擎在幕后使用Actor来实现主要实体的actor:规则链和规则节点。
规则引擎节点可以加入集群,其中每个节点负责传入消息的某些分区。
规则引擎从队列中订阅传入的数据并且仅在处理完消息后才对其进行确认。
有多种策略可用于控制顺序或消息处理以及消息确认的标准。 请参阅 提交策略 处理 处理策略。
ThingsBoard规则引擎可能以两种模式运行:共享和隔离
在共享模式下规则引擎处理多个租户的消息。
在隔离模式下规则引擎处理特定租户的消息。
ThingsBoard Web UI
ThingsBoard提供了一个使用Express.js框架编写的轻量级组件,用于承载静态Web ui内容。
这些组件是完全无状态的,没有太多可用的配置。
静态Web UI包含应用程序捆绑包加载后该应用程序将开始使用ThingsBoard核心提供的REST API和WebSockets API。
ThingsBoard支持多种消息队列实现:Kafka、RabbitMQ、AWS SQS、Azure服务总线和Google发布订阅。我们计划在将来扩展此列表。
使用持久和可伸缩的队列,ThingsBoard可以实现背压和负载平衡。在峰值负载的情况下,背压非常重要。
我们在特定的队列实现上提供“抽象层”并维护两个主要概念:主题和主题分区。
一个主题可能具有可配置数量的分区。由于大多数队列实现不支持分区,因此我们使用topic + “.” + partition模式。
ThingsBoard消息生产者根据实体ID的哈希值确定使用哪个分区。
因此同一实体的所有消息总是被推送到同一分区。
ThingsBoard消息使用者使用Zookeeper进行协调,并使用一致性哈希算法确定每个使用者应订阅的分区列表。
在微服务模式下运行时每个服务还基于唯一的服务ID(只有一个分区)具有专用的“通知”主题。
ThingsBoard使用以下主题:
注意: 所有主题属性(包括分区的名称和数量)都可以通过Thingsboard.yml或环境变量进行可配置。 我们计划在ThingsBoard 2.6或3.1中通过UI启用配置。
注意: 从2.5版开始我们已经从使用 gRPC 切换到 消息队列用于ThingsBoard组件之间的所有通信。
核心思想是牺牲少量的性能/延迟以支持持久可靠的消息传递和自动负载平衡。
ThingsBoard支持本地部署和云部署。
在全球运行着超过5000台ThingsBoard服务器之后,ThingsBoard在AWS,Azure,GCE和私有数据中心的生产环境中运行。
可以在完全没有互联网访问的专用网络中启动ThingsBoard。
该平台设计为可水平扩展,并支持自动发现新的ThingsBoard服务器(节点)。
集群中的所有ThingsBoard节点都是相同的,并且正在分担负载。
由于所有节点都相同,因此没有“主”或“协调器”过程,也没有单点故障。
你选择的负载均衡器可能会将来自设备,应用程序和用户的请求转发到所有ThingsBoard节点。
从ThingsBoard v2.2开始,对平台进行了重构,以支持微服务体系结构,而且还能够以独立模式将其作为整体应用程序运行。
支持这两个选项都需要一些额外的编程工作,但是由于与各种现有安装的向后兼容性,这一点至关重要。
ThingsBoard始终被设计为可作为分布式应用程序运行但最初也被设计为整体应用程序。
这意味着在每个服务器节点上只有一个Java进程在运行该应用程序。
这些进程正在使用gRPC进行通信,并且服务发现是通过Zookeeper完成的。
该模型适用于许多安装,并且只需最少的支持工作,知识和硬件资源即可进行设置。
但是微服务架构还解决了一些挑战,这些挑战适用于更复杂的部署和使用场景。
例如运行一个多租户部署,其中需要更精细的隔离以防止:
请点击下面列出的链接以了解更多信息,然后选择合适的架构和部署选项:
ThingsBard使用数据库进行存储 实体设备,资产,客户,仪表板等)和遥测数据(属性,时间序列传感器读数,统计信息,事件)。 平台目前支持三个数据库选项:
可以使用thingsboard.yml文件配置此选项。有关更多详细信息,请参见数据库配置页面。
database:
ts_max_intervals: "${DATABASE_TS_MAX_INTERVALS:700}" # Max number of DB queries generated by single API call to fetch telemetry records
entities:
type: "${DATABASE_ENTITIES_TYPE:sql}" # cassandra OR sql
ts:
type: "${DATABASE_TS_TYPE:sql}" # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
# note: timescale works only with postgreSQL database for DATABASE_ENTITIES_TYPE.
ThingsBoard后端是用Java编写的但是我们也有一些基于Node.js的微服务。
ThingsBoard前端是基于Angular JS框架的SPA。