一、ThingsBoard平台概述:平台架构、核心组件、数据模型、部署方式
大家好,我是你们这堂课的讲师。在正式开始讲集成实战之前,我觉得有必要先把ThingsBoard这个平台本身聊透。你想想看,如果连平台的核心骨架都不清楚,后面做集成的时候很容易踩坑。我在好几个项目里都见过这种情况——开发同学上来就调API,结果连数据是怎么流转的都没搞明白,最后排查问题花了好几天。
所以这一章,咱们就把ThingsBoard的底裤扒干净。我会从架构、组件、数据模型、部署四个维度来讲。嗯,都是干货。
1.1 平台架构:从宏观到微观
ThingsBoard的架构,说白了就是典型的微服务+消息队列模式。我个人习惯把它分成三层来看:
- 接入层:负责设备连接,支持MQTT、HTTP、CoAP、LwM2M等协议
- 核心层:处理数据路由、规则引擎、实体管理、权限控制
- 应用层:提供仪表板、告警、REST API、WebSocket等对外能力
这三层之间通过消息队列(Kafka或内存队列)解耦。为什么要这么设计?我在一个智慧工厂项目里遇到过,设备量从几百台突然涨到几万台,如果不用消息队列做缓冲,核心服务直接被打挂。所以这个架构不是花架子,是真能扛压的。
核心要点:ThingsBoard的架构设计遵循了「设备-平台-应用」的三层解耦原则。每一层都可以独立扩展,这也是它能支撑百万级设备接入的根本原因。
1.2 核心组件:每个零件都有它的脾气
咱们来看看ThingsBoard里那些关键组件。我按功能模块来拆解:
1.2.1 规则引擎(Rule Engine)
这是ThingsBoard的大脑。所有设备上报的数据、所有事件都会流经规则引擎。你可以把它理解成一个管道,数据进来后经过一系列节点处理,最终输出到目标。
节点类型包括:
- 过滤器节点:判断数据是否满足条件,比如温度大于50度才放行
- 转换节点:修改数据格式,比如把摄氏度转成华氏度
- 动作节点:执行具体操作,比如发送邮件、创建告警、调用REST API
- 外部节点:与第三方系统交互,比如Kafka、RabbitMQ、AWS SQS
我的经验:规则链的设计一定要先画流程图再动手。我曾经在一个项目中直接上手配节点,结果链子绕成了蜘蛛网,排查问题花了整整两天。后来我养成了习惯——先在白板上画清楚数据流向,再在平台里配。
1.2.2 设备管理(Device Management)
设备是ThingsBoard里的核心实体。每个设备都有一个唯一的设备令牌(Access Token),用来做身份认证。设备可以关联客户(Customer)、租户(Tenant),形成层级关系。
设备属性分为三类:
| 属性类型 | 说明 | 典型用途 |
|---|---|---|
| 服务端属性 | 由平台写入,设备只读 | 设备配置、固件版本 |
| 客户端属性 | 由设备上报,平台只读 | 设备序列号、硬件信息 |
| 共享属性 | 平台和设备均可读写 | 设备控制参数、阈值设置 |
1.2.3 仪表板(Dashboard)
仪表板是给用户看的面板。支持拖拽式布局,可以放图表、地图、表格、控件。我个人觉得它的灵活性相当不错,但要注意一点——仪表板的性能取决于数据查询方式。如果实时数据量大,建议用WebSocket而不是轮询。
1.2.4 告警系统(Alarm)
告警是ThingsBoard里比较成熟的功能。你可以通过规则引擎定义告警规则,比如温度连续3次超过阈值就触发告警。告警支持生命周期管理:创建、确认、清除。
避坑指南:我曾经遇到过告警风暴的问题——设备频繁上报临界值,导致告警数量爆炸。后来我在规则链里加了「去抖」逻辑,只有状态持续超过30秒才触发告警。这个经验分享给大家。
1.3 数据模型:实体之间的关系
ThingsBoard的数据模型,说白了就是一套树形结构。顶层是租户(Tenant),下面是客户(Customer),再下面是设备(Device)和资产(Asset)。
实体关系图可以这样理解:
- 一个租户可以有多个客户
- 一个客户可以有多个设备和资产
- 设备和资产可以关联到同一个客户
- 设备可以属于某个资产(比如一个传感器属于某个车间)
数据存储方面,ThingsBoard用了两种数据库:
| 数据库 | 存储内容 | 特点 |
|---|---|---|
| PostgreSQL / Cassandra | 实体元数据、关系、告警、日志 | 关系型存储,支持复杂查询 |
| TimescaleDB / Cassandra | 时序数据(遥测数据) | 高吞吐写入,按时间范围查询 |
这里要注意:时序数据库的选择直接影响性能。我在一个项目里用过Cassandra,写入确实快,但查询灵活性不如TimescaleDB。如果你的业务需要频繁做聚合查询(比如按小时统计平均值),我建议优先考虑TimescaleDB。
1.4 部署方式:从单机到集群
ThingsBoard的部署方式,我把它分成三种场景:
1.4.1 单机部署(开发/测试环境)
最简单的方式,用Docker Compose一键启动。适合本地开发、功能验证。配置如下:
version: '3.0'
services:
mytb:
image: thingsboard/tb-postgres:latest
ports:
- "8080:9090"
- "1883:1883"
- "5683:5683/udp"
environment:
TB_QUEUE_TYPE: in-memory
volumes:
- mytb-data:/data
嗯,这个配置里我用了内存队列(in-memory),因为单机场景不需要消息持久化。但生产环境千万别这么干。
1.4.2 高可用部署(生产环境)
生产环境我建议至少三台机器。架构是这样的:
- 负载均衡器(Nginx/HAProxy)做流量分发
- ThingsBoard节点至少2个,做水平扩展
- 消息队列用Kafka集群(3节点起步)
- 数据库用PostgreSQL主从 + TimescaleDB
- 缓存用Redis集群
关键配置:高可用模式下,必须把队列类型改成Kafka。我在生产环境里见过有人用内存队列跑集群,结果节点重启后数据全丢了。这个坑希望大家别踩。
1.4.3 边缘部署(Edge)
ThingsBoard Edge是专门为边缘场景设计的轻量版本。它可以在本地运行,与云端ThingsBoard保持同步。适合网络不稳定、延迟敏感的场景。
Edge的特点:
- 本地处理数据,减少云端依赖
- 断网时数据缓存,恢复后自动同步
- 资源占用小,可以跑在树莓派上
我在一个油田项目中用过Edge。井场网络很差,经常断网。我们把规则链部署在Edge上,本地做告警判断,数据缓存到网络恢复后再上传。效果相当不错。
小结
这一章咱们把ThingsBoard的底子打好了。架构上记住三层解耦,组件上重点掌握规则引擎和设备管理,数据模型理解租户-客户-设备的层级关系,部署方式根据场景选单机、集群还是边缘。
下一章咱们开始讲真正的集成实战——如何用REST API和MQTT把第三方系统接入ThingsBoard。到时候我会拿一个真实项目案例来拆解,保证你们学完就能用。
课后思考:如果你现在要设计一个支持10万台设备的IoT平台,你会选择哪种部署方式?为什么?欢迎在课程群里讨论。