2. ThingsBoard 架构总览:微服务架构、核心组件与租户位置

在深入租户管理之前,必须先理解 ThingsBoard 的整体架构。ThingsBoard 采用微服务架构,将平台功能拆分为多个独立服务,每个服务可独立部署、扩展和维护。这种架构为多租户资源隔离提供了天然基础——不同租户的流量和数据可以在服务层面进行逻辑或物理隔离。

2.1 微服务架构概览

ThingsBoard 的微服务架构围绕几个核心服务构建,每个服务负责特定的领域功能。下表列出了主要微服务及其职责:

微服务 核心职责 与租户的关系
Transport 服务 处理设备连接协议(MQTT、HTTP、CoAP、LwM2M) 按租户分配连接凭证,验证设备归属
Rule Engine 服务 执行消息处理、数据过滤、告警、动作触发 租户可自定义规则链,隔离执行上下文
Web UI 服务 提供用户管理界面、仪表板、设备管理 根据租户角色展示不同视图和数据
Core 服务 管理设备、资产、租户、用户等实体 维护租户与实体的归属关系
JS Executor 服务 执行 JavaScript 脚本(规则链、转换) 租户脚本运行在独立沙箱中
Queue 服务 消息队列(Kafka / RabbitMQ / AWS SQS) 租户消息可路由到独立队列
架构要点:ThingsBoard 的微服务之间通过消息队列(默认 Kafka)进行异步通信,这种松耦合设计使得租户隔离策略可以在消息路由层实现,例如将不同租户的消息分发到不同的消费者组。

2.2 核心组件详解

2.2.1 Transport 组件

Transport 是设备接入的网关,负责协议适配和连接管理。它支持多种物联网协议,并将设备上报的数据统一转换为内部消息格式,发送到消息队列。Transport 组件在租户维度执行以下关键操作:

  • 设备认证:验证设备凭证(Access Token、X.509 证书、MQTT 用户名/密码),确认设备所属租户。
  • 租户速率限制:对每个租户的连接数、消息频率进行配额控制。
  • 协议隔离:不同租户的设备可以使用不同的协议端口或 TLS 配置。

2.2.2 Rule Engine 组件

Rule Engine 是 ThingsBoard 的“大脑”,负责处理从 Transport 流入的消息。它基于规则链(Rule Chain)执行过滤、转换、持久化、告警、REST API 调用等操作。租户可以创建自己的规则链,实现业务逻辑的完全自定义。Rule Engine 的租户隔离机制包括:

  • 规则链隔离:每个租户拥有独立的规则链命名空间,互不可见。
  • 执行沙箱:JS 脚本在独立的 Node.js 沙箱中执行,防止租户脚本影响其他租户。
  • 资源配额:限制每个租户的规则节点数量、脚本执行时间、内存使用。

2.2.3 Web UI 组件

Web UI 是用户与平台交互的界面,基于 Angular 构建。它通过 REST API 和 WebSocket 与后端通信。Web UI 的租户感知能力体现在:

  • 租户切换:系统管理员可以切换到任意租户的上下文进行管理。
  • 数据隔离:仪表板、设备列表、告警等数据根据当前租户过滤。
  • 角色权限:租户管理员、客户用户等角色在 UI 层面拥有不同的操作权限。

2.3 租户在架构中的位置

租户是 ThingsBoard 多租户架构的核心隔离单元。从架构层面看,租户贯穿所有微服务,是数据归属和资源分配的根实体。下图展示了租户在微服务架构中的中心位置:

ThingsBoard 微服务架构与租户位置 租户(Tenant) 核心微服务层 Transport 服务 Rule Engine 服务 Web UI 服务 Core 服务 消息队列层(Kafka / RabbitMQ) 租户 A 队列 | 租户 B 队列 | 共享队列 数据持久化层 SQL(PostgreSQL) NoSQL(Cassandra) 时序数据库(TimescaleDB) 租户隔离关键点: ① 租户是顶层实体,所有微服务都感知租户上下文 ② 消息队列支持按租户分区,实现流量隔离 ③ 数据持久化层通过租户 ID 字段实现行级隔离 ④ 每个微服务均可独立扩展,支持租户级资源配额
架构要点总结:
  • 租户是顶层实体:在 ThingsBoard 中,租户位于实体层次结构的顶端,所有设备、资产、仪表板、规则链等实体都归属于某个租户。
  • 微服务共享租户上下文:每个微服务在处理请求时都会解析租户 ID,确保数据访问和操作都在租户边界内执行。
  • 消息队列支持租户分区:在 Kafka 等消息队列中,可以为不同租户分配独立的 topic 或 partition,实现消息级别的隔离。
  • 数据持久化层隔离:无论是 SQL 还是 NoSQL 数据库,所有表都包含 tenant_id 字段,作为数据隔离的第一道防线。

2.4 租户隔离的架构实现

ThingsBoard 在微服务架构中实现了多层次的租户隔离,确保不同租户的数据和资源互不干扰。下表总结了各层的隔离机制:

隔离层次 实现方式 隔离粒度
连接层 Transport 服务根据设备凭证确定租户,拒绝未授权连接 设备级
消息层 消息队列按租户 ID 路由到不同分区或 topic 消息级
处理层 Rule Engine 为每个租户维护独立的规则链执行上下文 规则链级
存储层 所有数据表包含 tenant_id 字段,查询时自动过滤 行级
展示层 Web UI 根据登录用户所属租户展示对应数据 用户级
资源层 微服务可配置租户级资源配额(连接数、消息速率、存储容量) 租户级
架构设计提示:在部署 ThingsBoard 时,可以根据租户规模选择隔离策略。对于高安全要求的租户,可以将其部署到独立的 Transport 或 Rule Engine 实例上,实现物理隔离;对于普通租户,使用逻辑隔离即可满足需求。微服务架构使得这种混合部署成为可能。