2. ThingsBoard 平台基础:架构、核心组件与数据流模型
在深入数据导出方案之前,必须理解 ThingsBoard 的底层架构与数据流转机制。本章将拆解 ThingsBoard 的微服务架构、规则链引擎、节点类型、队列模型以及数据从设备到存储的完整路径,为后续 CSV 与 Kafka 集成打下坚实基础。
2.1 ThingsBoard 整体架构简介
ThingsBoard 采用微服务 + 消息队列的松耦合架构,核心服务围绕 Transport(传输层)、Core(核心服务)、Rule Engine(规则引擎)三大模块构建。各模块通过 Kafka 或内存队列异步通信,支持水平扩展。
架构要点: 传输层负责设备协议接入(MQTT / HTTP / CoAP / LwM2M);核心服务处理设备管理、租户、用户、告警等元数据;规则引擎负责数据过滤、转换、持久化与外部集成。
2.2 核心组件详解
2.2.1 规则链(Rule Chain)
规则链是 ThingsBoard 数据处理的核心编排单元,由一系列节点(Node)通过关系(Relation)连接而成的有向无环图(DAG)。每条规则链处理特定类型的消息(Telemetry、Attributes、RPC Request 等),消息从根节点(Root Rule Chain)流入,经过过滤、转换、增强、持久化或导出后流出。
| 规则链类型 | 作用范围 | 典型用途 |
|---|---|---|
| Root Rule Chain | 系统全局 | 所有租户消息的入口,分发到租户链 |
| Tenant Rule Chain | 租户级别 | 按租户隔离的业务处理逻辑 |
| Device Profile Rule Chain | 设备配置级别 | 按设备类型定制的处理流程 |
2.2.2 节点(Node)
节点是规则链中的最小执行单元,每个节点完成一个原子操作。节点通过入参(Inbound)接收消息,处理后通过出参(Outbound)发送到下一个节点。节点类型分为六大类:
- Filter 节点: 条件过滤,如
Check Relation、Message Type Filter、Script Filter。 - Transform 节点: 数据转换,如
Script Transform、Change Originator、Rename Keys。 - Action 节点: 执行操作,如
Save Timeseries、Save Attributes、Create Alarm。 - External 节点: 外部集成,如
Kafka Producer、MQTT Producer、REST API Call、CSV Export。 - Enrichment 节点: 数据增强,如
Originator Attributes、Customer Attributes、Tenant Attributes。 - Split 节点: 消息拆分,如
Split Array、Gateway Telemetry。
关键提示: 数据导出到 CSV 或 Kafka 主要依赖 External 节点 中的
Kafka Producer Node 和 REST API Call Node(配合 CSV 生成服务)。理解节点配置中的 Queue Name 和 Retry Policy 是保证导出可靠性的关键。
2.2.3 队列(Queue)
队列是规则引擎的异步缓冲层,用于解耦消息生产与消费。每个规则链节点可以绑定一个队列,队列决定消息的提交策略、重试机制和并发度。ThingsBoard 内置两种队列实现:
| 队列类型 | 实现方式 | 适用场景 | 持久化 |
|---|---|---|---|
| InMemory Queue | 内存队列 | 开发测试、低吞吐场景 | 否(重启丢失) |
| Kafka Queue | Apache Kafka | 生产环境、高吞吐、高可靠 | 是(可配置持久化) |
队列配置参数(在 thingsboard.yml 中定义)直接影响数据导出性能:
# 队列配置示例(Kafka 模式)
queue:
type: kafka
kafka:
bootstrap_servers: "localhost:9092"
topic_properties: "retention.ms=604800000" # 7天保留
request_timeout_ms: 30000
max_in_flight_requests_per_connection: 5
# 规则引擎节点队列绑定
rule_engine:
queues:
Main:
poll_interval: 25
pack_processing_timeout: 2000
submit_strategy: BURST # BURST / SEQUENTIAL_BY_ORIGINATOR
HighPriority:
poll_interval: 10
pack_processing_timeout: 1000
submit_strategy: SEQUENTIAL_BY_ORIGINATOR
2.3 数据流模型
理解数据从设备到存储的完整路径,是配置导出规则的前提。ThingsBoard 的数据流遵循 “设备 → 传输 → 队列 → 规则引擎 → 存储/导出” 的标准化管道。
2.4 数据流关键路径说明
- 设备上报: 设备通过 MQTT/HTTP/CoAP 协议上报遥测数据或属性更新,传输层完成协议解析与设备认证。
- 消息入队: 传输层将解析后的消息发布到指定的队列(Kafka Topic 或 InMemory Queue),消息包含
msgType、originator、data、metadata等字段。 - 规则引擎消费: 规则引擎从队列拉取消息,根据消息类型路由到对应的规则链。规则链中的节点按配置顺序执行过滤、转换、增强、持久化或导出操作。
- 数据导出: 当消息到达 External 节点(如 Kafka Producer Node 或 REST API Call Node)时,数据被导出到外部系统。CSV 导出通常通过 REST API 调用外部微服务生成,或通过 Kafka 消息触发下游 CSV 生成器。
- 持久化: 规则链中的 Action 节点(如 Save Timeseries、Save Attributes)将数据写入数据库,确保数据不丢失。
常见误区: 初学者常认为规则链是“实时同步”的,实际上规则链通过队列异步处理,消息可能因队列积压或节点处理超时而延迟。导出任务应关注 队列积压指标(
queue.size)和 节点处理耗时(node.processing.time),避免导出延迟过高。
2.5 数据导出相关节点速查表
| 节点名称 | 类型 | 用途 | 导出方式 |
|---|---|---|---|
| Kafka Producer | External | 将消息发送到指定的 Kafka Topic | 异步消息 |
| REST API Call | External | 通过 HTTP POST/PUT 调用外部 REST 服务 | 同步/异步 |
| MQTT Producer | External | 将消息转发到外部 MQTT Broker | 异步消息 |
| Save Timeseries | Action | 将遥测数据持久化到时序数据库 | 内部存储 |
| Save Attributes | Action | 将属性数据持久化到实体属性表 | 内部存储 |
| Script Transform | Transform | 使用 JavaScript/TBEL 转换消息格式 | 预处理 |
| Split Array | Split | 将数组消息拆分为多条独立消息 | 预处理 |