简介
本文介绍单体架构,包括高层架构图、各组件间的数据流说明及部分架构选型说明。
请注意,自ThingsBoard v2.2起,平台支持微服务部署模式。尽管微服务更适合高可用、可水平扩展的场景,不少ThingsBoard用户仍倾向于先以单实例起步,后续再扩展。
我们也推荐在开发与原型验证阶段使用单体模式。
在单体模式下,所有ThingsBoard组件运行于同一Java虚拟机(JVM)中,共享同一操作系统资源。由于ThingsBoard采用Java编写,单体架构的明显优势是可最小化运行ThingsBoard所需内存。在资源受限环境中,可用256或512MB RAM启动并运行ThingsBoard进程。明显劣势是,若某个组件(如MQTT传输)负载过高,可能影响其他组件。例如,若ThingsBoard进程的OS文件描述符上限为4096,则无法并行打开超过4096个MQTT会话及WebSocket用户会话。
架构图
传输组件
ThingsBoard提供基于MQTT、HTTP和CoAP的API,供设备应用或固件使用。各协议API由独立的服务器组件提供,属于ThingsBoard”传输层”。完整组件列表及对应文档页如下:
各传输组件将数据推送给Rule Engine,并可能调用核心服务向数据库发起请求,以校验设备凭据等。
由于ThingsBoard在传输层与核心服务之间采用非常简单的通信协议,实现自定义传输协议支持(如纯TCP上的CSV、UDP上的二进制负载等)较为容易。建议查看现有传输实现入手,或联系我们获取帮助。
Rule Engine组件
ThingsBoard Rule Engine负责按用户定义的逻辑和流程处理到达的消息。更多信息请参见对应文档页。
核心服务
核心服务负责处理:
ThingsBoard节点使用Actor System实现租户、设备、Rule Chain与Rule Node Actor。平台节点可加入集群,各节点地位平等。服务发现通过Zookeeper完成。ThingsBoard节点之间使用基于实体ID的consistent hashing算法路由消息。因此,同一实体的消息在同一ThingsBoard节点上处理。平台使用gRPC在ThingsBoard节点间发送消息。
注意:ThingsBoard作者计划在未来版本中使用Kafka替代gRPC进行节点间消息交换。主要考虑是在性能与延迟上做出小幅牺牲,换取Kafka consumer groups带来的持久可靠投递与自动负载均衡。
外部系统
可通过Rule Engine将消息从ThingsBoard推送到外部系统。可将数据推送到外部系统、进行处理,并将处理结果回传至ThingsBoard进行可视化。详见Rule Engine文档与指南。