thingsboard/summary/21-镜像交互关系分析.md

704 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ThingsBoard 镜像交互关系分析
## 1. 概述
本文档基于文档17Docker镜像分类分析、文档19镜像打包命令以及源码和docker配置文件详细分析ThingsBoard各个镜像之间的交互关系和依赖关系。
## 2. 镜像交互架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ 外部设备/用户 │
└────────────┬────────────────────────────┬──────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ HAProxy │ │ HAProxy │
│ (负载均衡) │ │ (负载均衡) │
└────────┬────────┘ └─────────┬────────┘
│ │
├──────────────┬───────────────┤
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
│ tb-web-ui1 │ │tb-mqtt-trans│ │tb-http-trans │
│ tb-web-ui2 │ │port1/2 │ │port1/2 │
└──────┬───────┘ └──────┬──────┘ └──────┬───────┘
│ │ │
│ └────────┬────────┘
│ │
▼ ▼
┌─────────────────────────────────────────┐
│ Kafka (消息队列) │
└──────┬───────────┬──────────────┬───────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│tb-core1 │ │tb-core2 │ │tb-rule-engine│
│ │ │ │ │1/2 │
└────┬─────┘ └────┬─────┘ └──────┬───────┘
│ │ │
└────────────┼───────────────┘
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌──────────┐ ┌────────────┐
│PostgreSQL│ │ Cassandra│ │ Valkey │
│ │ │ │ │ (缓存) │
└─────────┘ └──────────┘ └────────────┘
```
## 3. 基础设施镜像交互关系
### 3.1 ZooKeeper (服务发现)
**镜像**: `zookeeper:3.8.1`
**被哪些服务依赖**:
-**所有 ThingsBoard 服务**(作为服务发现中心)
**依赖的镜像**:
- 无(基础设施服务)
**交互方式**:
- 所有 ThingsBoard 服务通过 ZooKeeper 进行服务注册和发现
- 配置: `ZOOKEEPER_ENABLED=true`, `ZOOKEEPER_URL=zookeeper:2181`
**具体依赖服务列表**:
1. `tb-core1`, `tb-core2`
2. `tb-rule-engine1`, `tb-rule-engine2`
3. `tb-mqtt-transport1`, `tb-mqtt-transport2`
4. `tb-http-transport1`, `tb-http-transport2`
5. `tb-coap-transport`
6. `tb-lwm2m-transport`
7. `tb-snmp-transport`
8. `tb-vc-executor1`, `tb-vc-executor2`
9. `tb-edqs1`, `tb-edqs2`(如果启用)
---
### 3.2 PostgreSQL (SQL数据库)
**镜像**: `postgres:16`
**被哪些服务依赖**:
-**tb-core1**, **tb-core2**(存储实体数据)
-**tb-rule-engine1**, **tb-rule-engine2**(读取实体数据)
**依赖的镜像**:
- 无(数据库服务)
**交互方式**:
- JDBC 连接: `jdbc:postgresql://postgres:5432/thingsboard`
- 配置: `DATABASE_TS_TYPE=sql`SQL模式
**用途**:
- 存储租户、用户、设备、资产、规则链等实体数据
- 存储时序数据在SQL模式下
---
### 3.3 Cassandra (NoSQL数据库可选)
**镜像**: `cassandra:5.0`
**被哪些服务依赖**:
-**tb-core1**, **tb-core2**(混合模式下的时序数据存储)
-**tb-rule-engine1**, **tb-rule-engine2**(混合模式)
**依赖的镜像**:
- 无(数据库服务)
**交互方式**:
- Cassandra 客户端连接
- 配置: `DATABASE_TS_TYPE=cassandra`(混合模式)
**用途**:
- 存储时序数据(遥测数据)
- 仅在混合数据库模式下使用hybrid模式
---
### 3.4 Kafka (消息队列)
**镜像**: `bitnamilegacy/kafka:4.0`
**被哪些服务依赖**:
-**tb-core1**, **tb-core2**
-**tb-rule-engine1**, **tb-rule-engine2**
-**tb-mqtt-transport1**, **tb-mqtt-transport2**
-**tb-http-transport1**, **tb-http-transport2**
-**tb-coap-transport**
-**tb-lwm2m-transport**
-**tb-snmp-transport**
-**tb-vc-executor1**, **tb-vc-executor2**
-**tb-js-executor**(所有副本)
-**tb-edqs1**, **tb-edqs2**(如果启用)
**依赖的镜像**:
- 无(消息队列服务)
**交互方式**:
- Kafka Producer/Consumer API
- 配置: `TB_QUEUE_TYPE=kafka`, `TB_KAFKA_SERVERS=kafka:9092`
**消息主题类型**:
- `tb-core.*`: 核心服务消息
- `tb.rule-engine.*`: 规则引擎消息
- `tb.transport.*`: 传输服务消息
- `tb.notifications.*`: 通知消息
- `tb.js-evaluator.*`: JS执行器消息
**用途**:
- **所有 ThingsBoard 服务间异步通信的中枢**
- 实现服务解耦和高可用
---
### 3.5 Valkey (缓存)
**镜像**: `bitnamilegacy/valkey:8.0` (或 sentinel/cluster 模式)
**被哪些服务依赖**:
-**tb-core1**, **tb-core2**
-**tb-rule-engine1**, **tb-rule-engine2**
-**tb-mqtt-transport1**, **tb-mqtt-transport2**
-**tb-http-transport1**, **tb-http-transport2**
-**tb-coap-transport**
-**tb-lwm2m-transport**
-**tb-snmp-transport**
-**tb-vc-executor1**, **tb-vc-executor2**
**依赖的镜像**:
- 无(缓存服务)
**交互方式**:
- Redis 协议Valkey兼容Redis协议
- 配置: `CACHE_TYPE=redis`, `REDIS_HOST=valkey`
**用途**:
- 缓存设备属性
- 缓存会话信息
- 提高查询性能
---
## 4. ThingsBoard 核心服务镜像交互关系
### 4.1 tb-core (核心服务)
**镜像**: `thingsboard/tb-node` (通过 `TB_SERVICE_TYPE=tb-core` 区分)
**服务实例**: `tb-core1`, `tb-core2`
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**PostgreSQL** - 实体数据存储
3.**Cassandra** - 时序数据存储(混合模式)
4.**Kafka** - 消息队列通信
5.**Valkey** - 缓存
6.**tb-js-executor** - JavaScript 执行
7.**tb-rule-engine1**, **tb-rule-engine2** - 规则引擎(需要规则引擎启动)
**被哪些服务依赖**:
1.**tb-mqtt-transport1/2** - 接收传输层消息
2.**tb-http-transport1/2** - 接收传输层消息
3.**tb-coap-transport** - 接收传输层消息
4.**tb-lwm2m-transport** - 接收传输层消息
5.**tb-snmp-transport** - 接收传输层消息
6.**tb-vc-executor1/2** - 版本控制执行
7.**tb-web-ui1/2** - 提供 REST API
8.**tb-rule-engine1/2** - 核心服务推送消息到规则引擎
9.**HAProxy** - 负载均衡转发请求
**交互方式**:
**接收消息通过Kafka**:
- 从传输服务接收: `ToCoreMsg` 类型消息
- `TransportToDeviceActorMsg`: 设备遥测、属性、RPC响应
- `DeviceConnectProto`: 设备连接
- `DeviceDisconnectProto`: 设备断开
**发送消息通过Kafka**:
- 发送到规则引擎: `ToRuleEngineMsg` 类型消息
- 发送到传输服务: `ToTransportMsg` 类型消息
- `ToDeviceRpcRequestMsg`: RPC请求
- `AttributeUpdateNotificationMsg`: 属性更新通知
- `SessionCloseNotificationProto`: 会话关闭
**HTTP交互**:
- 提供 REST API 供 `tb-web-ui` 调用
- 端口: `8080` (HTTP API)
**数据库交互**:
- PostgreSQL: 读写实体数据
- Cassandra: 读写时序数据(混合模式)
**缓存交互**:
- Valkey: 读写设备属性缓存
---
### 4.2 tb-rule-engine (规则引擎)
**镜像**: `thingsboard/tb-node` (通过 `TB_SERVICE_TYPE=tb-rule-engine` 区分)
**服务实例**: `tb-rule-engine1`, `tb-rule-engine2`
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**PostgreSQL** - 读取实体数据(规则链配置等)
3.**Kafka** - 消息队列通信
4.**Valkey** - 缓存
5.**tb-js-executor** - JavaScript 规则节点执行
**被哪些服务依赖**:
1.**tb-core1**, **tb-core2** - 核心服务推送消息到规则引擎
2.**tb-edqs1**, **tb-edqs2** - 事件驱动查询(可选)
**交互方式**:
**接收消息通过Kafka**:
- 从核心服务接收: `ToRuleEngineMsg` 类型消息
- 设备遥测数据
- 设备属性更新
- 设备事件(连接、断开等)
**发送消息通过Kafka**:
- 发送到核心服务: `ToCoreMsg` 类型消息
- 规则链处理后的结果(保存数据、触发告警等)
**HTTP交互**:
- 提供内部 REST API
- 端口: `8080`
**数据库交互**:
- PostgreSQL: 读取规则链配置
**缓存交互**:
- Valkey: 缓存规则链元数据
---
## 5. 传输服务镜像交互关系
### 5.1 tb-mqtt-transport (MQTT传输服务)
**镜像**: `thingsboard/tb-mqtt-transport`
**服务实例**: `tb-mqtt-transport1`, `tb-mqtt-transport2`
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**Kafka** - 消息队列通信
3.**Valkey** - 缓存
4.**tb-core1**, **tb-core2** - 通过ZooKeeper发现核心服务
**被哪些服务依赖**:
-**HAProxy** - 负载均衡转发MQTT连接端口1883
**交互方式**:
**接收消息(从设备)**:
- MQTT协议: 端口 `1883`
- 接收设备遥测、属性、RPC响应
**发送消息通过Kafka**:
- 发送到核心服务: `ToCoreMsg` 类型消息
- `TransportToDeviceActorMsg`: 设备遥测、属性
- `DeviceConnectProto`: 设备连接事件
- `DeviceDisconnectProto`: 设备断开事件
**接收消息通过Kafka**:
- 从核心服务接收: `ToTransportMsg` 类型消息
- `ToDeviceRpcRequestMsg`: RPC请求
- `AttributeUpdateNotificationMsg`: 属性更新通知
**缓存交互**:
- Valkey: 缓存设备会话信息
---
### 5.2 tb-http-transport (HTTP传输服务)
**镜像**: `thingsboard/tb-http-transport`
**服务实例**: `tb-http-transport1`, `tb-http-transport2`
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**Kafka** - 消息队列通信
3.**Valkey** - 缓存
4.**tb-core1**, **tb-core2** - 通过ZooKeeper发现核心服务
**被哪些服务依赖**:
-**HAProxy** - 负载均衡转发HTTP请求端口8081
**交互方式**:
-`tb-mqtt-transport` 类似,但使用 HTTP 协议
- HTTP端口: `8081`
---
### 5.3 tb-coap-transport (CoAP传输服务)
**镜像**: `thingsboard/tb-coap-transport`
**服务实例**: `tb-coap-transport`
**依赖和交互**:
-`tb-mqtt-transport` 类似
- CoAP端口: `5683/udp`
---
### 5.4 tb-lwm2m-transport (LWM2M传输服务)
**镜像**: `thingsboard/tb-lwm2m-transport`
**服务实例**: `tb-lwm2m-transport`
**依赖和交互**:
-`tb-mqtt-transport` 类似
- LWM2M端口: `5685/udp`, `5686/udp`
---
### 5.5 tb-snmp-transport (SNMP传输服务)
**镜像**: `thingsboard/tb-snmp-transport`
**服务实例**: `tb-snmp-transport`
**依赖和交互**:
-`tb-mqtt-transport` 类似
- SNMP端口: `1620/udp`
---
## 6. 前端服务镜像交互关系
### 6.1 tb-web-ui (Web前端)
**镜像**: `thingsboard/tb-web-ui`
**服务实例**: `tb-web-ui1`, `tb-web-ui2`
**依赖的镜像**:
1.**tb-core1**, **tb-core2** - 通过HTTP REST API交互
**被哪些服务依赖**:
-**HAProxy** - 负载均衡转发HTTP请求端口80/443
**交互方式**:
**HTTP交互**:
- 前端通过HTTP REST API调用核心服务
- API路径: `/api/*`
- 核心服务端口: `8080`
**WebSocket交互**:
- 建立WebSocket连接到核心服务
- 接收实时数据推送(设备遥测、属性更新)
**说明**:
- `tb-web-ui` **不直接依赖** ZooKeeper、Kafka、数据库
- 所有与后端的交互都通过 `tb-core` 的 REST API 和 WebSocket
---
## 7. 辅助服务镜像交互关系
### 7.1 tb-js-executor (JavaScript执行器)
**镜像**: `thingsboard/tb-js-executor`
**服务实例**: `tb-js-executor` (10个副本)
**依赖的镜像**:
1.**Kafka** - 接收JavaScript执行请求
**被哪些服务依赖**:
1.**tb-core1**, **tb-core2** - 执行JavaScript规则节点
2.**tb-rule-engine1**, **tb-rule-engine2** - 执行JavaScript规则节点
**交互方式**:
**接收消息通过Kafka**:
- Kafka主题: `tb.js-evaluator.*`
- 接收JavaScript执行请求来自规则引擎
**发送消息通过Kafka**:
- 返回JavaScript执行结果
**说明**:
- `tb-js-executor` **不依赖** ZooKeeper通过Kafka主题直接通信
- 配置: `JS_EVALUATOR=remote`
---
### 7.2 tb-vc-executor (版本控制执行器)
**镜像**: `thingsboard/tb-vc-executor`
**服务实例**: `tb-vc-executor1`, `tb-vc-executor2`
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**Kafka** - 消息队列通信
3.**Valkey** - 缓存
4.**tb-core1**, **tb-core2** - 接收版本控制请求
**被哪些服务依赖**:
-**tb-core1**, **tb-core2** - 版本控制功能
**交互方式**:
- 通过Kafka接收版本控制相关的消息
- 处理规则链、脚本等资源的版本控制
---
### 7.3 tb-edqs (事件驱动查询服务)
**镜像**: `thingsboard/tb-edqs`
**服务实例**: `tb-edqs1`, `tb-edqs2` (可选)
**依赖的镜像**:
1.**ZooKeeper** - 服务发现
2.**Kafka** - 消息队列通信
**被哪些服务依赖**:
1.**tb-core1**, **tb-core2** - 可选,用于高性能查询
2.**tb-rule-engine1**, **tb-rule-engine2** - 可选,用于高性能查询
**交互方式**:
- 通过Kafka接收查询请求
- 提供高性能的事件驱动查询服务
**说明**:
- 这是**可选服务**仅在启用EDQS功能时使用
- 配置文件: `tb-core-edqs.env`, `tb-rule-engine-edqs.env`
---
## 8. 负载均衡镜像交互关系
### 8.1 HAProxy
**镜像**: `thingsboard/haproxy-certbot:2.2.33-alpine`
**依赖的镜像**:
- 无(基础设施服务)
**被哪些服务依赖**:
-**外部用户/设备** - 通过HAProxy访问ThingsBoard服务
**交互的后端服务**:
1.**tb-core1**, **tb-core2** - API请求`/api/*`
2.**tb-web-ui1**, **tb-web-ui2** - Web UI请求
3.**tb-mqtt-transport1**, **tb-mqtt-transport2** - MQTT连接端口1883
4.**tb-http-transport1**, **tb-http-transport2** - HTTP传输端口8081
5.**tb-core1**, **tb-core2** - Edges RPC端口7070
**端口映射**:
- `80` → Web UI (HTTP)
- `443` → Web UI (HTTPS)
- `1883` → MQTT Transport
- `7070` → Edges RPC
- `9999` → HAProxy Stats
**配置方式**:
- 通过 `links` 配置后端服务
- 配置文件: `haproxy/config/haproxy.cfg`
---
## 9. 消息流向分析
### 9.1 设备数据流(上行)
```
设备
→ tb-mqtt-transport (MQTT协议)
→ Kafka (ToCoreMsg)
→ tb-core (处理设备数据)
→ Kafka (ToRuleEngineMsg)
→ tb-rule-engine (规则链处理)
→ PostgreSQL/Cassandra (存储数据)
→ Kafka (ToTransportMsg, 如果需要推送到设备)
→ tb-mqtt-transport
→ 设备
```
### 9.2 Web UI数据流
```
用户浏览器
→ HAProxy (负载均衡)
→ tb-web-ui (前端服务)
→ HTTP REST API
→ tb-core (处理API请求)
→ PostgreSQL (读取/写入数据)
→ tb-core (返回结果)
→ tb-web-ui (渲染页面)
→ 用户浏览器
```
### 9.3 规则引擎数据流
```
tb-core
→ Kafka (ToRuleEngineMsg)
→ tb-rule-engine (接收消息)
→ tb-js-executor (执行JavaScript, 如果需要)
→ Kafka (JavaScript执行结果)
→ tb-rule-engine (规则链处理)
→ PostgreSQL/Cassandra (保存处理结果)
→ Kafka (ToCoreMsg, 如果需要通知核心服务)
→ tb-core
```
### 9.4 RPC请求流下行
```
用户/规则引擎
→ tb-core (接收RPC请求)
→ Kafka (ToTransportMsg - ToDeviceRpcRequestMsg)
→ tb-mqtt-transport (接收RPC请求)
→ 设备 (MQTT协议)
→ tb-mqtt-transport (接收RPC响应)
→ Kafka (ToCoreMsg - FromDeviceRpcResponse)
→ tb-core (返回RPC响应)
→ 用户/规则引擎
```
---
## 10. 依赖关系总结表
### 10.1 直接依赖关系depends_on
| 服务 | 依赖的基础设施 | 依赖的ThingsBoard服务 |
|------|---------------|---------------------|
| **tb-core1/2** | ZooKeeper, PostgreSQL, Kafka, Valkey | tb-js-executor, tb-rule-engine1/2 |
| **tb-rule-engine1/2** | ZooKeeper, PostgreSQL, Kafka, Valkey | tb-js-executor |
| **tb-mqtt-transport1/2** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-http-transport1/2** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-coap-transport** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-lwm2m-transport** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-snmp-transport** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-web-ui1/2** | 无 | tb-core1/2 (通过HTTP) |
| **tb-js-executor** | Kafka | 无 |
| **tb-vc-executor1/2** | ZooKeeper, Kafka, Valkey | tb-core1/2 |
| **tb-edqs1/2** | ZooKeeper, Kafka | tb-core1/2, tb-rule-engine1/2 |
| **HAProxy** | 无 | tb-core1/2, tb-web-ui1/2, tb-mqtt-transport1/2, tb-http-transport1/2 |
### 10.2 通过Kafka的间接依赖关系
**所有 ThingsBoard 服务都通过 Kafka 进行消息通信**:
- **tb-mqtt-transport** → Kafka → **tb-core** → Kafka → **tb-rule-engine** → Kafka → **tb-js-executor**
### 10.3 通过数据库的间接依赖关系
- **tb-core**, **tb-rule-engine** → PostgreSQL (实体数据)
- **tb-core** → Cassandra (时序数据,混合模式)
### 10.4 通过缓存的间接依赖关系
- **tb-core**, **tb-rule-engine**, **传输服务**, **tb-vc-executor** → Valkey (属性缓存)
---
## 11. 关键交互协议
### 11.1 服务发现协议
- **ZooKeeper**: 所有ThingsBoard服务通过ZooKeeper进行服务注册和发现
- **配置**: `ZOOKEEPER_URL=zookeeper:2181`
### 11.2 消息通信协议
- **Kafka**: 所有ThingsBoard服务间异步消息通信
- **消息格式**: Protobuf 序列化
- **配置**: `TB_QUEUE_TYPE=kafka`, `TB_KAFKA_SERVERS=kafka:9092`
### 11.3 数据访问协议
- **PostgreSQL**: JDBC协议 (`jdbc:postgresql://postgres:5432/thingsboard`)
- **Cassandra**: Cassandra客户端协议混合模式
### 11.4 缓存协议
- **Valkey**: Redis协议 (`REDIS_HOST=valkey:6379`)
### 11.5 HTTP协议
- **tb-web-ui** → **tb-core**: HTTP REST API (`/api/*`)
- **WebSocket**: 实时数据推送
---
## 12. 启动顺序建议
基于依赖关系,建议的启动顺序:
1. **基础设施层**:
- ZooKeeper
- PostgreSQL / Cassandra
- Kafka
- Valkey
2. **辅助服务层**:
- tb-js-executor (10个副本)
3. **核心服务层**:
- tb-rule-engine1, tb-rule-engine2
- tb-core1, tb-core2
4. **传输服务层**:
- tb-mqtt-transport1/2
- tb-http-transport1/2
- tb-coap-transport
- tb-lwm2m-transport
- tb-snmp-transport
5. **前端服务层**:
- tb-web-ui1, tb-web-ui2
6. **负载均衡层**:
- HAProxy
7. **可选服务** (如果需要):
- tb-vc-executor1/2
- tb-edqs1/2
---
## 13. 总结
### 13.1 核心交互模式
1. **所有ThingsBoard服务****ZooKeeper** (服务发现)
2. **所有ThingsBoard服务****Kafka** (异步消息通信)
3. **传输服务****Kafka****tb-core****Kafka****tb-rule-engine**
4. **tb-core, tb-rule-engine****PostgreSQL** (实体数据)
5. **tb-core, tb-rule-engine, 传输服务****Valkey** (缓存)
6. **tb-web-ui****HTTP****tb-core** (REST API)
7. **tb-core, tb-rule-engine****Kafka****tb-js-executor** (JavaScript执行)
### 13.2 关键发现
1. **Kafka是核心通信枢纽**: 所有ThingsBoard服务间通信都通过Kafka
2. **ZooKeeper是服务发现中心**: 所有ThingsBoard服务都需要ZooKeeper进行服务注册和发现
3. **tb-core是核心服务**: 连接传输层、规则引擎、数据库和前端
4. **传输服务直接与设备通信**: 通过MQTT/HTTP/CoAP等协议
5. **tb-web-ui通过HTTP与tb-core交互**: 不直接访问数据库或Kafka
6. **tb-js-executor是异步服务**: 通过Kafka接收执行请求不依赖ZooKeeper
---
## 14. 参考文档
- [17-Docker镜像分类分析.md](./17-Docker镜像分类分析.md)
- [19-ThingsBoard所有镜像打包命令.md](./19-ThingsBoard所有镜像打包命令.md)
- [02-模块交互与通信机制.md](./02-模块交互与通信机制.md)