赞
踩
通过了解架构及技术栈,初步认识ThingsBoard
通过官方文档可知ThingsBoard
有两种架构模式
JavaScript
执行器)、Web UI(界面)等多个服务,服务之间使用消息队列通信Spring
Spring Boot
Spring
的引导,提高了开发效率Maven
protobuf
(Protocol Buffers)
Google推出的一种数据描述语言,用于定义与语言无关的数据结构
可根据具体的语言动态生成对应的数据结构,后缀为 .proto
syntax = "proto3"; package msgqueue; option java_package = "org.thingsboard.server.common.msg.gen"; option java_outer_classname = "MsgProtos"; // Stores message metadata as map of strings message TbMsgMetaDataProto { map<string, string> data = 1; } // Stores stack of nested (caller) rule chains message TbMsgProcessingStackItemProto { int64 ruleChainIdMSB = 1; int64 ruleChainIdLSB = 2; int64 ruleNodeIdMSB = 3; int64 ruleNodeIdLSB = 4; } message TbMsgProcessingCtxProto { int32 ruleNodeExecCounter = 1; repeated TbMsgProcessingStackItemProto stack = 2; } message TbMsgProto { string id = 1; string type = 2; string entityType = 3; int64 entityIdMSB = 4; int64 entityIdLSB = 5; int64 ruleChainIdMSB = 6; int64 ruleChainIdLSB = 7; int64 ruleNodeIdMSB = 8; int64 ruleNodeIdLSB = 9; int64 clusterPartition = 10; TbMsgMetaDataProto metaData = 11; // Transaction Data (12) was removed in 2.5 int32 dataType = 13; string data = 14; int64 ts = 15; // Will be removed in 3.4. Moved to processing context int32 ruleNodeExecCounter = 16; int64 customerIdMSB = 17; int64 customerIdLSB = 18; TbMsgProcessingCtxProto ctx = 19; }
如上使用proto3
协议定义了org.thingsboard.server.common.msg.gen.MsgProtos
类
用于传输数据的结构定义
HTTP
(Hyper Text Transfer Protocol)
超文本传输协议,最常见的数据传输协议
用于设备和ThingsBoard
间的数据交互,以及用户与ThingsBoard
间的操作交互等
MQTT
(Message Queuing Telemetry Transport)
基于发布/订阅模式的协议,支持三种质量等级,广泛应用于物联网
用于设备和ThingsBoard
间的数据交互
CoAP
(Constrained Application Protocol)
基于UDP
的REST
风格协议,相较于HTTP
更加轻量级
虽然是UDP
,但通过消息类型支持消息的可靠传输
4种消息类型如下:
用于设备和ThingsBoard
间的数据交互
LwM2M
(Lightweight Machine to Machine)
是CoAP
的上层协议,基于对象/资源模型进行交互,对象是资源的集合,需要实例化后使用
主要组成部分:
用于设备和ThingsBoard
间的数据交互
SNMP
(Simple Network Management Protocol)
基于UDP
的网络管理协议,采用特殊的客户机/服务器模式进行通信
用于设备和ThingsBoard
间的数据交互
Netty
一个基于JAVA NIO
的高性能的、异步事件驱动的通信框架,可由开发者自定义传输协议
主要用于实现ThingsBoard
中MQTT
服务端与客户端
gRPC
(google Remote Procedure Call)
google
推出的基于HTTP/2
远程调用框架
HTTP/2
相较于HTTP/1.x
主要有如下优势:
主要用于设备和ThingsBoard
间的数据交互
Azure Service Bus
微软在Azure上提供的一种云消息服务,和RabbitMQ
、KafKa
一样作为消息通信服务
Pubsub
(Google Cloud Pub/Sub)
一种具有传递和接受消息的事件驱动以及流分析系统,跟KafKa
比较相似
SQS
(Amazon Simple Queue Service)
一个分布式的消息队列服务
提供了两种队列:
Kafka
一种高吞吐量、持久性、分布式的发布订阅的消息队列系统
RabbitMQ
一个由erlang开发的AMQP
(Advanced Message Queue高级消息队列协议)的开源实现,性能较好
Memory
ThingsBoard
实现的基于内存的消息队列
PostgreSQL
免费的开源关系型数据库
相较于MySQL
:
MVCC
(Multi-Version Concurrency Control)基于新旧数据一同管理模式,需要定期VACUUM
清理旧数据,存在额外的消耗用于存储非遥测数据,根据存储模式也可存储遥测数据
Cassandra
由Facebook
开发的、用于大数据的、开源分布式的NoSQL存储系统
具有以如下特性:
ZooKeeper
)的对等分布式架构,数据分布在集群中的所有节点间,无中心节点,无单点故障提供了类似SQL的COL语句
用于存储遥测数据
Actor
Actor
模型中,Actor
模型间通过消息队列通信,异步串行地处理消息,以避免多线程对于共享资源的竞争Actor
模型由三部分组成:
caffeine
Cache<Key, Graph> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10_000)
.build();
// 查找一个缓存元素, 没有查找到的时候返回null
Graph graph = cache.getIfPresent(key);
// 查找缓存,如果缓存不存在则生成缓存元素, 如果无法生成则返回null
graph = cache.get(key, k -> createExpensiveGraph(key));
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.invalidate(key);
LoadingCache<Key, Graph> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(key -> createExpensiveGraph(key));
// 查找缓存,如果缓存不存在则生成缓存元素, 如果无法生成则返回null
Graph graph = cache.get(key);
// 批量查找缓存,如果缓存不存在则生成缓存元素
Map<Key, Graph> graphs = cache.getAll(keys);
AsyncCache<Key, Graph> cache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(10_000)
.buildAsync();
// 查找一个缓存元素, 没有查找到的时候返回null
CompletableFuture<Graph> graph = cache.getIfPresent(key);
// 查找缓存元素,如果不存在,则异步生成
graph = cache.get(key, k -> createExpensiveGraph(key));
// 添加或者更新一个缓存元素
cache.put(key, graph);
// 移除一个缓存元素
cache.synchronous().invalidate(key);
AsyncLoadingCache<Key, Graph> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(10, TimeUnit.MINUTES)
// 你可以选择: 去异步的封装一段同步操作来生成缓存元素
.buildAsync(key -> createExpensiveGraph(key));
// 你也可以选择: 构建一个异步缓存元素操作并返回一个future
.buildAsync((key, executor) -> createExpensiveGraphAsync(key, executor));
// 查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Graph> graph = cache.get(key);
// 批量查找缓存元素,如果其不存在,将会异步进行生成
CompletableFuture<Map<Key, Graph>> graphs = cache.getAll(keys);
Redis
(Remote Dictionary Server)Node.js
JavaScript
运行环境,实现了JavaScript
在服务端的应用AntiSamy
Java
和.Net
版Guava
ZooKeeper
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。