everything如何建立索引:架构和基本概念
everything如何建立索引:架构和基本概念ThingsBoard Core 它主要处理:rest API 的调用、WebSocket 订阅实体遥测数据和属性更改、监控设备的连接状态,以及其他与消息处理不直接相关的计算。核心服务 - Core servicesThingsboard 提供基于 MQTT、HTTP 和 CoAP 协议的 API,供设备或固件使用,并支持自定义实现传输协议。传输组件会将数据推送到规则引擎,并且可以使用核心服务请求处理设备认证。规则引擎组件 - Rule engine componentThingsBoard 规则引擎按照用户定义的逻辑和流程,来处理传入的消息。这个模块相当于 ThingsBoard 心脏,后续会单独详细介绍。
本文简单整理下 ThingsBoard 架构设计和基本概念,以及项目源码组织结构和数据库设计,基于 v3.3.4.1 版本。
微服务架构暂不研究,此系列文章最终目的是简单模拟实现一个数据采集和可视化的练手项目。
1. 单机架构架构图
传输组件 - Transport components
Thingsboard 提供基于 MQTT、HTTP 和 CoAP 协议的 API,供设备或固件使用,并支持自定义实现传输协议。传输组件会将数据推送到规则引擎,并且可以使用核心服务请求处理设备认证。
规则引擎组件 - Rule engine component
ThingsBoard 规则引擎按照用户定义的逻辑和流程,来处理传入的消息。这个模块相当于 ThingsBoard 心脏,后续会单独详细介绍。
核心服务 - Core services
ThingsBoard Core 它主要处理:rest API 的调用、WebSocket 订阅实体遥测数据和属性更改、监控设备的连接状态,以及其他与消息处理不直接相关的计算。
外部系统 - External systems
通过规则引擎可将消息推送到外部系统,比如 Kafka,RabbitMQ,Email,SMS。
2. 基本概念(1)实体和关系 - Entities and relations
ThingsBoard 中支持的实体有:
- 租户(Tenants) - 拥有或制造设备和资产的个人或组织;
- 客户(Customers) - 购买或使用租户设备、资产的个人或组织;
- 用户(Users) - 能够浏览仪表板和管理实体;
- 设备(Devices) - 物联网设备,可产生遥测数据和处理 rpc 命令,例如,传感器、执行器、开关;
- 资产(Assets) - 与设备和其他资产相关的物联网抽象实体,例如工厂、田地、车辆;
- 实体视图(Entity Views) - 用于共享设备或资产的部分数据;
- 警报(Alarms) - 识别资产,设备和其他实体是否有问题需要告警;
- 仪表板(Dashboards) - 可视化物联网数据,以及通过页面控制特定设备;
- 规则节点(Rule Node) - 传入消息、实体生命周期事件等的处理单元;
- 规则链(Rule Chain) - 定义规则引擎中的处理流程,可能包含多个规则节点和到其他规则链的链接;
每个实体又支持:
- 属性(Attributes) - 与实体关联的静态和半静态键值对。例如序列号、型号、固件版本;
- 时间序列数据(Time-series data) - 可用于存储、查询和可视化的时间序列数据点。例如温度、湿度、电池电量;
- 关系(Relations) - 与其他实体的定向连接。例如包含、管理、拥有、生产。
关系 - Relations
关系的概念有助于在 ThingsBoard 中对物理世界对象进行建模,即物模型,可将它视为面向对象编程的 Has-a 关系。
例如,有一个蔬菜大棚,要构建一个应用程序,收集土壤湿度和温度传感器数据,在仪表板可视化数据,检测问题发出警报和控制灌溉。程序要支持数百个传感器的多个大棚,大棚也可以位于不同的区域。
下图描述了这些实体是如何配置和存储在 ThingsBoard 中的:
注: Field A 和 Field B 可理解为 A 和 B 两个大棚,它们俩组成了一个片区,这些都是用户资产。
(2)实体属性 - Attributes
给实体自定义属性,可用于处理数据和可视化,属性以键值对的形式存储在数据库,键是字符串,值可以是字符串、布尔值、双精度、整数或 JSON。例如:
{
"firmwareVersion":"v2.3.1"
"booleanParameter":true
"doubleParameter":42.0
"longParameter":73
"configuration": {
"someNumber": 42
"someArray": [1 2 3]
"someNestedObject": {"key": "value"}
}
}
属性类型又分为:
- 服务器端属性 - 设备固件无法访问,比如建筑监控,纬度、经度和地址是可分配给建筑物或其他不动产的资产的服务器端属性的好例子;
- 共享属性 - 仅适用于设备,类似于服务器端属性,唯一区别是,设备固件可获取属性值;
- 客户端属性 - 仅适用于设备,用于将各种半静态数据从设备上报到 ThingsBoard,常见的比如上报设备状态。
(3)遥测数据 - Telemetry
使用各种协议从设备收集的数据,时序数据存储在 SQL 数据库中,ThingsBoard 支持最新时序数据或指定时间范围内的所有数据,灵活聚合查询,以及 WebSocket 订阅数据更新。
(4)规则引擎 - Rule engine
用于构建基于事件的工作流,由三个部分组成:
- 消息 (message) - 任何传入的事件,设备传入的数据、设备生命周期事件、REST API 事件、RPC 请求等;
- 规则节点 (Rule Node) - 处理传入的消息,比如过滤、转换或执行特定操作;
- 规则链 (Rule Chain) - 通过关系连接起来的规则节点。
ThingsBoard 使用 Maven 和 Gradle 构建,Gradle主要构建 Linux 下的 rpm 和 deb 安装包。v3.3.4.1 版本,源码结构下:
application: 应用主模块
src/main/java/org.thingsboard.server:
actors: actor 执行
config: 配置类目录
controller: 控制器
exception: 异常处理
install: 安装更新服务
service: 服务功能实现
utils: 工具类,web 相关
common: 通用模块,接口设计所在,模块关联使用
actor: Actor system 的实现
cache: 缓存处理,caffeine 或 redis
cluster-api: 集群服务接口设计
coap-server: CoAP 服务,处理 CoAP 协议的接入
dao-api: 数据访问对象接口设计
data: 通用业务数据结构
edge-api: 对远程 Edge 服务使用的封装
message: 各种消息事件的封装实现
queue: 消息队列服务的实现和适配
stats: 状态统计
transport: 传输通道的实现,处理设备使用不同协议的接入
util: 工具类
dao: 数据访问对象的实现,主要适配 PostgreSQL 和 Cassandra 数据库
docker: 微服务 docker 容器部署,包含容器配置和脚本
msa: 微服务模块
block-box-tests: 黑盒测试工具
js-executor: js 执行引擎,基于 nodejs 用于执行规则引擎中的 js 代码c
tb: 主应用服务 docker 配置
tb-node: 安装服务 docker 配置
transport: 传输服务 docker 配置
web-ui: web 界面 docker 配置
netty-mqtt: 基于 Netty 实现的 MQTT Client
packaging: 应用资源打包逻辑配置
rest-client: 一个 rest http client 实现
rule-engine: 规则引擎的实现
rule-engine-api: 服务接口设计
rule-engine-components: 规则引擎组件,处理消息过滤,转换,转发,RPC 调用等
tools: 服务工具类
transport: 消息传输服务启动器
ui-ngx: Web 管理界面,基于 Angular
4. 数据库设计
ThingsBoard v3.3.4.1 版本总共有 41 张表,按功能分类介绍如下。
(1)用户相关实体
- tb_user: 用户表,系统管理员,租户管理员和客户
- user_credentials: 用户鉴权信息表,存储用户名、密码,重置令牌
- tenant: 租户信息表,存储租户个人资料
- tenant_profile: 租户通用配置表,方便多租户共享配置
- customer: 客户信息表
(2)资产设备实体
- asset: 资产信息表,类型、描述、所属客户和租户
- device: 设备信息表,设备配置文件、固件及软件版本、所属客户和租户
- device_profile: 设备通用配置表,方便多个设备共享配置
- device_credentials: 设备鉴权信息表
(3)遥测数据
- ts_kv: 遥测数据表,包含历史时间点数据,以键值对形式存储
- ts_kv_dictionary: 遥测数据字典表
- ts_kv_latest: 遥测数据最新值
(4)规则引擎
- rule_chain: 规则链表
- rule_node: 规则节点表
- rule_node_state: 规则节点状态表
- component_descriptor: 规则组件信息表
(5)数据可视化
- dashboard: 仪表盘信息表
- relation: 实体关系表
- attribute_kv: 实体自定义属性表
- entity_view: 实体视图表,用于共享实体部分数据
- widget_type: 可视化部件表
- widgets_bundle: 部件库信息表,部件归类
- alarm: 告警信息表
- entity_alarm: 告警视图表
(6)边缘计算
- edge: 边缘计算服务信息表
- edge_event: 边缘计算事件表
(7)OAuth2 授权
- oauth2_registration: 授权注册信息表
- oauth2_client_registration: 授权域信息表,域名、访问协议等
- oauth2_client_registration_template: 授权注册信息模板,请求授权所需配置
- oauth2_client_registration_info: 授权客户端注册信息
- oauth2_domain: 授权域信息表
- oauth2_mobile: 移动端授权信息表
- oauth2_params: 授权用户信息
(8)其他
- event: 实体事件表
- rpc: rpc 调用请求或响应数据表
- resource: 资源数据表,如密钥文件
- audit_log: 审计日志表
- api_usage_state: 接口使用信息表
- ota_package: 固件信息表
- tb_schema_settings: 当前数据库表结构版本,升级使用
- admin_settings: 系统设置表