thingsboard
第一章 thingsboard 部署场景与性能需求
性能需求
第二章 thingsboard 规则链的queues 参数配置
在thingsboard 中默认提供三种队列配置,其差别主要为为提交以及处理策略。
| name | topic | submit_strategy | processing_strategy | pack_prcessing_timeout |
|---|---|---|---|---|
| Main | tb_rule_engine.main | BURST;batchSize:1000 | type:SKIP_ALL_FAILURES;retries:3;failurePercentage:0.0;pauseBetweenRetries:3;maxPauseBetweenRetries:3 | 2000 |
| HightPrority | tb_rule_engine.hp | BURST;batchSize:100 | type:RETRY_FAILED_TIMED_OUT;retries:0;failurePercentage:0.0;pauseBetweenRetries:5;maxPauseBetweenRetries:5 | 2000 |
| SequentialByOriginator | tb_rule_engine.sq | SEQUENTAL_BY_ORIGINATOR;batchSize:100 | type:RETRY_FAILED_TIMED_OUT;retries:3;failurePercentage:0.0;pauseBetweenRetries:3;maxPauseBetweenRetries:3 | 2000 |
queue的配置说明
Submit setting--定义了消息被提交到规则引擎的逻辑以及顺序
- BURST-- 所有的message按照顺序被提交至规则引擎
- Batch--使用分组参数将消息分组,在未确认前一个批处理之前,不会提交新的批处理
- Sequential--消息被一个个提交。新的消息只能在上一个消息被提交后才可以。其效率非常低下
- Sequential by tenant --消息在以租户为区分,并按照顺序提交。
- Sequential by originator--针对某一个[特殊设备]需求消息被一条一条进行提交。且新的消息提交必须在前一条消息提交成功确认后才能提交。
Retires processing setting -定义消息确认逻辑 重试处理有六种有效的策略
- retry failed and timeout --在消息包中重试所有失败以及超时的消息
- skip all failures --忽略所有的错误消息。错误的消息将会被丢弃。例如db发生宕机时,消息不会被持久化,而是被标记为已确认。并且从消息队列中进行删除。【一般不推荐使用】
- skip all failures and timeouts -- 忽略所有的错误以及超时消息。
- retry all--重试处理包中的所有消息。嘉定处理包中共有100条信息,当其中一条失败,则所有的消息将会被重新处理提交到规则引擎。
- retry faild --只重试处理包中的失败的消息。
- retry timeout--重试超时的消息。
重试策略中的参数
- number of retries 重试次数,0 表示无限制重试
- percentage of failure messages for skipping retries --跳过重试失败消息的百分比。即就是当失败,或超时的消息的百分比少于定义的百分率时,跳过重试
- retry within --重试之前,消费者线程进行重试之前需要等待的时间,单位为秒。该参数通常用于在操作,或任务失败后需要再一定的时间间隔内进行重试
- additional retry within -- 第二次以及后续重试的等待时间
Polling setting --轮训设定
- 批处理的场合
- poll interval --轮询间隔:只在没有新消息到达时,消息轮询的时间间隔,以毫秒为单位。新消息没有到达时,消息的轮询机制会周期性的检查消息队列以获取新的消息。
- partitions --消息队列关联的分区数,可增加消息消费的并发能力
- 及时处理的场合
- send message poll for each consumer 页面UI配置中提供了该项目的设定,当未选定的场合,其默认所有的分区只有一个消费者。若配置,则每个分区分别指定其消费者
- processing within--消费者返回的特定的消息包的时间间隔。
thingsboard中以kafka 作为queue代理的场合,其相关参数的配置说明
| parameter | environment variable | default value | description |
|---|---|---|---|
| queue.type | TB_QUEUE_TYPE | in-memory | 可选择值,im-memory,kafka,awssqs,pubsub,service-bus,rabbitmq |
| queue.prefix | TB_QUEUE_PREFIX | Globale queue prefix,if specified the prefix ,all top mame been added the prefix | |
| queue.in_memory.stats.print-internal-ms | TB_QUEUE_IN_MOMENY_STATS_PRINT_INTERVAL_MS | 60000 | For debug level 生产环境可注释掉 |
| queue.kafka.acks | TB_KAFKA_ACKS | all | 请求完成之前,生产者要求领导已收到确认确认次数,可选择的值为0,1,all |
| queue.kafka.reties | TB_KAFKA_RETRIES | 1 | 重试次数。重新发送任何失败并可能出现短暂错误的记录 |
| queue.kafka.compression.type | TB_KAFKA_COMPRESSION_TYPE | none | 可选择值none or zip |
| queue.kafka.batch.size | TB_KAFKA_BATCH_SIZE | 16384 | 默认的批处理大小 |
| queue.kafka.max.request.size | TB_KAFKA_MAX_REQUEST_SIZE | 1048576 | 一个请求的最大字节数。该参数用于限定生产者在单个请求中发送的记录的批次数量,以避免发送庞大的请求。 |
| queue.kafka.max.flight.requests.per.connection | 5 | 在阻塞前,客户端在一个单一连接上发送的最大的无确认的请求数 | |
| queue.kafka.buffer.memory | 33554432 | 内存总计的字节数,生产者可以使用的缓存大小在发送到服务器之前 | |
| queue.kafka.linger.ms | 1 | 该变量创建少量的人为延迟,即就是不会立即发送一条记录 | |
| queue.kafka.replication_factor | 1 | 数据在kafka上的代理副本数.该参数用于设置kafka队列到的复制因子。在kafka中,复制因子指定在每个分区上的副本数量。目的,增加数据的冗余备份。确保即使某个分区,或副本发生故障,仍可以从其他副本上获取消息。建议一般设置的数量大于等于2 | |
| queue.kafka.max_poll_interval_ms | 300000 | ||
| queue.kafka.max_poll_records | 8192 | 在单次的poll()返回的最大记录数 | |
| queue.kafka.max_partition_fetch_bytes | 16777216 | 每一个分区数据返回的最大量 | |
| queue.kafka.fetch_max_bytes | 134217728 | 服务最大的返回数据量 | |
| queue.kafka.request.timeout.ms | 30000 | 请求超时的时间 | |
| queue.kafka.session.timeout.ms | 10000 | ||
| queue.kafka.auto_offset_reset | earliest | 可选择参数:earliest;latest or none |
kafka中produce的关联参数
- buffer.memory 约束kafka 生产者能够使用的缓冲区的大小。默认值32MB.
- 若buffer.memory 设置太小,其可能导致问题,消息快速的被写入内存的缓存中,但sender线程来不及发送,导致消息堆积,最终缓存被写满,发生线程阻塞。生产者级不能再继续往往kafka中写消息了。
- batch.size 生产者在发送消息之前,一次性积累到的消息的大小。producer采用分批发送机制,该参数即控制一个batch的大小。默认是16KB
- 当生产者主备发送消息时,首先将消息发送到内存中的缓存中,而后对消息进行分批次,批次的大小由bach.size参数指定。当消息批次中的字节数达到规定的阈值时,该批次消息被一起发送到kafka服务器。
- acks 用于配置生产者发送消息的确认模式
- aks=0的场合,生产者不会邓艾服务器端的任何响应,只是请求发送,无法感知消息的发送失败或丢失。其最不可靠。
- acks=1:生产者在发送消息后,会收到服务器端的消息确认。即就是至少一个副本已经成功获取消息。生产者仍然存在消息丢失的风险,因在接受确认之前,可能会存在副本的故障以及数据丢失。默认的模式
- acks=all 或-1:生产者在发消息之后将等待所有的副本都成功接收到消息。最可靠的消息确认模式。处理效率最慢。
- linger.ms 配置生产者发送消息的延迟
- 默认状况下,生产者会立即发送消息到服务器端,但为提高生产者的效率与吞吐量,可设置linger.ms参数。其设定延迟,使得生产者在缓冲区中积累的消息达到一定量时,而后一次性发送。其指定在缓冲区等待的时间,若消息未达到【【batch.size】定义的大小的阈值,但时间已经超过,则依然发送。
- compression.type 指定生产者发送消息至kafka服务器的消息的压缩类型。若配置压缩方式,kafka服务器端可自行进行解压操作。
- none 不器用压缩
- gzip 使用gzip的研所算法进行数据压缩
- snappy 使用snapp压缩算法压缩消息,其压缩效率快,占用较少的CPU资源。但相对于gzip 压缩较低
- lz4 使用lz4的压缩算法
- max.in.flight.requests.per.connection 控制生产者之服务器端单个链接上发送的最大的未确认的请求数量
- 参数定义生产者在没有收到服务器响应之前,可以发送到同一连接的最大的未确认请求数量。生产者消息在发送到服务器后,会等待服务器确认成功接收请求并发送响应。在等待响应的期间,生产者可继续发送更多的请求。该参数指定在没有收到服务器响应之前可以发送的最大的请求数量。设定值较小的场合可降低网络与生产者的负载。
- retries 指定生产者在发送可重试错误时尝试发送消息的最大次数
- 生产者向服务器发送消息时,可能会存在一些可重试的错误,如网络连接错误,分区不可用错误,超时处理等。retries参数指定最大的次数。且可通过参数指定每次重试时间间隔。retire.backoff.ms。
- retries 参数仅对可重试的错误有效。对于不可恢复的错误设置(消息太大无法处理或分区不存在的错误等)生产者将不会再重试。
Thingsboard 本地源码编译运行
注意事项
- 无效化插件
license
<!-- <plugin>-->
<!-- <groupId>com.mycila</groupId>-->
<!-- <artifactId>license-maven-plugin</artifactId>-->
<!-- <version>3.0</version>-->
<!-- <configuration>-->
<!-- <header>${main.dir}/license-header-template.txt</header>-->
<!-- <properties>-->
<!-- <owner>The Thingsboard Authors</owner>-->
<!-- </properties>-->
<!-- <excludes>-->
<!-- <exclude>**/.env</exclude>-->
<!-- <exclude>**/*.env</exclude>-->
<!-- <exclude>**/.eslintrc</exclude>-->
<!-- <exclude>**/.babelrc</exclude>-->
<!-- <exclude>**/.jshintrc</exclude>-->
<!-- <exclude>**/.gradle/**</exclude>-->
<!-- <exclude>**/nightwatch</exclude>-->
<!-- <exclude>**/README</exclude>-->
<!-- <exclude>**/LICENSE</exclude>-->
<!-- <exclude>**/banner.txt</exclude>-->
<!-- <exclude>node_modules/**</exclude>-->
<!-- <exclude>**/*.properties</exclude>-->
<!-- <exclude>src/test/resources/**</exclude>-->
<!-- <exclude>src/vendor/**</exclude>-->
<!-- <exclude>src/font/**</exclude>-->
<!-- <exclude>src/sh/**</exclude>-->
<!-- <exclude>packaging/*/scripts/control/**</exclude>-->
<!-- <exclude>packaging/*/scripts/windows/**</exclude>-->
<!-- <exclude>packaging/*/scripts/init/**</exclude>-->
<!-- <exclude>**/*.log</exclude>-->
<!-- <exclude>**/*.current</exclude>-->
<!-- <exclude>.instance_id</exclude>-->
<!-- <exclude>src/main/scripts/control/**</exclude>-->
<!-- <exclude>src/main/scripts/windows/**</exclude>-->
<!-- <exclude>src/main/resources/public/static/rulenode/**</exclude>-->
<!-- <exclude>**/*.proto.js</exclude>-->
<!-- <exclude>docker/haproxy/**</exclude>-->
<!-- <exclude>docker/tb-node/**</exclude>-->
<!-- <exclude>ui/**</exclude>-->
<!-- <exclude>**/.browserslistrc</exclude>-->
<!-- <exclude>**/yarn.lock</exclude>-->
<!-- <exclude>**/.yarnrc</exclude>-->
<!-- <exclude>**/.angular/**</exclude>-->
<!-- <exclude>**/*.raw</exclude>-->
<!-- <exclude>**/*.patch</exclude>-->
<!-- <exclude>**/apache/cassandra/io/**</exclude>-->
<!-- <exclude>.run/**</exclude>-->
<!-- <exclude>**/NetworkReceive.java</exclude>-->
<!-- <exclude>**/lwm2m-registry/**</exclude>-->
<!-- </excludes>-->
<!-- <mapping>-->
<!-- <proto>JAVADOC_STYLE</proto>-->
<!-- <cql>DOUBLEDASHES_STYLE</cql>-->
<!-- <scss>JAVADOC_STYLE</scss>-->
<!-- <jsx>SLASHSTAR_STYLE</jsx>-->
<!-- <tsx>SLASHSTAR_STYLE</tsx>-->
<!-- <conf>SCRIPT_STYLE</conf>-->
<!-- <gradle>JAVADOC_STYLE</gradle>-->
<!-- </mapping>-->
<!-- </configuration>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <goals>-->
<!-- <goal>check</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>com.mycila</groupId>-->
<!-- <artifactId>license-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
- msa 中的
### js-executor 运行报错- 事象:
Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.12.0:yarn (yarn pkg) on project js-executor: Failed to run task: 'yarn run pkg' failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 2 (Exit value: 2) -> [Help 1]- 解决案
1. yarn install -g pkg