ThingsBoard 租户配置
正文与配图来自原稿。租户配置(Tenant Profile)在系统层由系统管理员管理;上一篇见 ThingsBoard 租户。
1、概述
租户配置(tenant profile)如其名是租户相关的配置,通俗一点就是给你这个租户的功能增加一些限制——如果你加钱,我就给你把限制设置高一点,ThingsBoard 官方那个收费的版本不就是这样的吗?
租户配置在系统层,系统管理员可以创建租户配置,然后使用租户配置为多个租户进行设置。这样租户就会按照配置中的一些规则来执行。

2、创建租户配置
点击右上角【+】进行创建租户配置,为租户配置起一个名字。如果你不进行配置,都使用默认 0 即可(表示不限制)。

然后点击记录弹出右边栏,包含的就是详细信息、遥测、告警之类的,了解即可,最应该关注的就是里面的配置设置。

3、配置详解
实体配置

这个配置全是针对实体的限制。如上图,0 就是没有限制,你的租户想创建多少就创建多少;如果设置了就会按照设置的来执行。下面演示一下,我都设置为 1。

现在我创建一个租户绑定这个配置,然后演示上面所有的配置限制。
先创建租户:

在租户下面创建一个管理员:

进入到租户:

现在开始演示:

最大设备数
创建第一个设备:

现在创建第二个设备,直接提示说不能够超过 1 个设备:

最大仪表盘数
创建第一个仪表板:

再创建第二个仪表板,直接提示不能超过 1 个仪表板:

最大资产数
创建第一个资产:

创建第二个资产,直接提示不能超过 1 个资产:

最大用户数
默认情况下,我在创建租户的时候给租户默认创建了一个租户管理员,也就是用户。现在我给客户创建一个管理员用户就直接提示用户不能超过 1:

最大客户数
创建第一个客户:

创建第二个客户,直接提示不能超过 1 个客户:

最大规则链数
创建第一条规则链(系统默认有一条根链):

创建第二条规则链,直接提示不能超过 1 条规则链:

规则引擎配置

最大规则引擎执行数
规则引擎执行意味着属于当前租户下的规则节点的任何执行。处理单个遥测消息可能会导致多次执行规则引擎。该平台还将统计 Generator Node 等产生的周期性消息。
最大传输消息数
传输消息是指你的设备发送到服务器的任何消息。这可能是遥测、属性更新、RPC 调用等。
最大 JavaScript 执行数
JavaScript 执行数意味着租户管理员定义的自定义函数的任何执行。例如,处理 “Script” 过滤器或转换节点、调用数据转换器等。
最大传输数据点数
传输数据点是指遥测或属性消息所包含的键-值对的数量。例如,下面列出的消息包含 5 个数据点,因为 jsonKey 对应一个数据点。注意:如果 String 或 JSON 键的值大于 512 个字符,平台会将其作为多个数据点计算。
{
"stringKey": "value1",
"booleanKey": true,
"doubleKey": 42.0,
"longKey": 73,
"jsonKey": {
"someNumber": 42,
"someArray": [1, 2, 3],
"someNestedObject": { "key": "value" }
}
}每条消息的最大规则节点执行数
最大规则节点执行数就是设备上报一条数据最多可以经过多少个规则节点处理,也就是最大的规则链长度。
TTL 配置(过期时间配置)

数据点存储天数(最大存储点天)
为存储在数据库中的所有时间序列数据点计算数据点存储天数。平台将数据点的数量乘以这些数据点将被存储的天数。TTL 参数用于提取存储数据的天数。例如,如果您将 3 个数据点存储 30 天,则这是 90 个存储数据点日。
告警 TTL 天数
表示在数据库中存储警报的天数。
默认存储 TTL 天数
系统管理员可以使用租户配置文件中的「默认存储 TTL 天数」参数配置默认 TTL。租户管理员能够使用 “Save Timeseries” 节点配置,或在遥测请求中使用 TTL 参数来覆盖默认 TTL。

RPC TTL 天数
RPC TTL 天数就是设置你的 RPC 在数据库持久化多久。
告警与通知

最大电子邮件发送数
发送的电子邮件是指使用系统 SMTP 提供程序(设置)从规则引擎发送的电子邮件数量。请注意,租户管理员能够在平台的社区版和专业版中定义自定义 SMTP 设置。使用自定义 SMTP 设置发送的电子邮件不影响 API 限制。后续讲解发送邮件。
最大创建告警数
创建告警是在系统中最多能创建多少条告警。
最大短信发送数
SMS 发送是指使用系统 SMS 提供程序从规则引擎发送的 SMS 数量。请注意,租户管理员能够在平台的社区版和专业版中定义自定义 SMS 提供程序设置。使用自定义 SMTP 设置发送的短信不影响 API 限制。
OTA 文件(字节)配置

资源文件总大小
限制租户最大能上传多少文件大小的总和。
OTA 包文件总大小
单个升级文件大小限制。
WS 设置

| 配置项 | 含义 |
|---|---|
| 租户 WS 最大会话数 | 租户与系统最多能创建多少个连接会话 |
| 租户 WS 最大订阅数 | 租户最大能开启多少个订阅 |
| 客户 WS 最大会话数 | 客户与系统最多能创建多少个连接会话 |
| 客户 WS 最大订阅数 | 客户最大能开启多少个订阅 |
| 公共用户最大会话数 | 公共用户就是管理员用户,管理员用户最大创建的会话数 |
| 公共用户最大订阅数 | 公共用户就是管理员用户,管理员用户最大的订阅数 |
| 普通用户最大会话数 | 普通用户最大创建的会话数 |
| 普通用户最大订阅数 | 普通用户最大创建的订阅数 |
| 会话最大消息队列大小 | 会话通讯的消息分配的消息队列限制 |
速率限制配置

根据官方文档说明:这些速率限制是基于令牌桶算法,速率限制配置的格式就是:值:时间(单位秒)。
速率限制定义由值和时间间隔组成。例如,1000:60 表示「每 60 秒不超过 1000 条消息」。可以用 , 定义多个间隔。例如,100:1,1000:60 意味着「每秒 100 条消息的爆发,但每 60 秒不超过 1000 次」。


配置对应的字段
数据库字段示例:
{
"configuration": {
"type": "DEFAULT",
"maxSms": 0,
"maxUsers": 1,
"maxAssets": 1,
"maxEmails": 0,
"maxDevices": 1,
"rpcTtlDays": 0,
"maxCustomers": 1,
"alarmsTtlDays": 0,
"maxDashboards": 1,
"maxRuleChains": 1,
"warnThreshold": 0,
"maxJSExecutions": 0,
"maxREExecutions": 0,
"maxCreatedAlarms": 0,
"maxDPStorageDays": 0,
"maxResourcesInBytes": 0,
"maxTransportMessages": 0,
"defaultStorageTtlDays": 0,
"maxOtaPackagesInBytes": 0,
"maxTransportDataPoints": 0,
"maxWsSessionsPerTenant": 0,
"maxWsSessionsPerCustomer": 0,
"wsMsgQueueLimitPerSession": 0,
"maxWsSessionsPerPublicUser": 0,
"maxWsSessionsPerRegularUser": 0,
"maxWsSubscriptionsPerTenant": 0,
"tenantEntityExportRateLimit": null,
"tenantEntityImportRateLimit": null,
"transportDeviceMsgRateLimit": null,
"transportTenantMsgRateLimit": null,
"wsUpdatesPerSessionRateLimit": "",
"maxWsSubscriptionsPerCustomer": 0,
"maxRuleNodeExecutionsPerMessage": 0,
"maxWsSubscriptionsPerPublicUser": 0,
"maxWsSubscriptionsPerRegularUser": 0,
"tenantServerRestLimitsConfiguration": "",
"transportDeviceTelemetryMsgRateLimit": null,
"transportTenantTelemetryMsgRateLimit": null,
"customerServerRestLimitsConfiguration": "",
"cassandraQueryTenantRateLimitsConfiguration": "",
"transportDeviceTelemetryDataPointsRateLimit": null,
"transportTenantTelemetryDataPointsRateLimit": null
},
"queueConfiguration": null
}对应的 Java 类(原稿摘录):
package org.thingsboard.server.common.data.tenant.profile;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.ApiUsageRecordKey;
import org.thingsboard.server.common.data.TenantProfileType;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class DefaultTenantProfileConfiguration implements TenantProfileConfiguration {
private long maxDevices;
private long maxAssets;
private long maxCustomers;
private long maxUsers;
private long maxDashboards;
private long maxRuleChains;
private long maxResourcesInBytes;
private long maxOtaPackagesInBytes;
private String transportTenantMsgRateLimit;
private String transportTenantTelemetryMsgRateLimit;
private String transportTenantTelemetryDataPointsRateLimit;
private String transportDeviceMsgRateLimit;
private String transportDeviceTelemetryMsgRateLimit;
private String transportDeviceTelemetryDataPointsRateLimit;
private String tenantEntityExportRateLimit;
private String tenantEntityImportRateLimit;
private long maxTransportMessages;
private long maxTransportDataPoints;
private long maxREExecutions;
private long maxJSExecutions;
private long maxDPStorageDays;
private int maxRuleNodeExecutionsPerMessage;
private long maxEmails;
private long maxSms;
private long maxCreatedAlarms;
private String tenantServerRestLimitsConfiguration;
private String customerServerRestLimitsConfiguration;
private int maxWsSessionsPerTenant;
private int maxWsSessionsPerCustomer;
private int maxWsSessionsPerRegularUser;
private int maxWsSessionsPerPublicUser;
private int wsMsgQueueLimitPerSession;
private long maxWsSubscriptionsPerTenant;
private long maxWsSubscriptionsPerCustomer;
private long maxWsSubscriptionsPerRegularUser;
private long maxWsSubscriptionsPerPublicUser;
private String wsUpdatesPerSessionRateLimit;
private String cassandraQueryTenantRateLimitsConfiguration;
private int defaultStorageTtlDays;
private int alarmsTtlDays;
private int rpcTtlDays;
private double warnThreshold;
@Override
public long getProfileThreshold(ApiUsageRecordKey key) {
switch (key) {
case TRANSPORT_MSG_COUNT:
return maxTransportMessages;
case TRANSPORT_DP_COUNT:
return maxTransportDataPoints;
case JS_EXEC_COUNT:
return maxJSExecutions;
case RE_EXEC_COUNT:
return maxREExecutions;
case STORAGE_DP_COUNT:
return maxDPStorageDays;
case EMAIL_EXEC_COUNT:
return maxEmails;
case SMS_EXEC_COUNT:
return maxSms;
case CREATED_ALARMS_COUNT:
return maxCreatedAlarms;
}
return 0L;
}
@Override
public long getWarnThreshold(ApiUsageRecordKey key) {
return (long) (getProfileThreshold(key) * (warnThreshold > 0.0 ? warnThreshold : 0.8));
}
@Override
public TenantProfileType getType() {
return TenantProfileType.DEFAULT;
}
@Override
public int getMaxRuleNodeExecsPerMessage() {
return maxRuleNodeExecutionsPerMessage;
}
}4、使用独立的规则引擎服务
4.1、介绍
ThingsBoard Rule Engine 是集群中的主要「工作人员」,负责处理传入消息。默认情况下,所有消息(如遥测、连接和生命周期事件)都被推送到相同的消息队列/主题(由 Kafka、RabbitMQ、AWS SQS、Azure 服务总线、谷歌 Pub/Sub 提供支持)。当隔离处理被禁用时(默认),ThingsBoard 将所有租户的消息推送到一个公共队列(main)。
当你为特定租户选择要隔离的处理时,ThingsBoard 将消息推到单独的队列。这为这些租户提供了更好的隔离级别。
4.2、隔离租户的队列配置
配置流程:
- 打开租户配置文件菜单并添加新的租户配置文件。勾选 “isolated ThingsBoard RuleEngine” 框,默认添加了 Main 队列,不能重命名和删除。
- 如果需要添加新的自定义队列,请单击 “添加队列”。
- 配置提交和处理设置。
- 最后为特定的租户分配租户配置文件即可。
配置队列:


取名并配置提交策略:

| 策略 | 含义 |
|---|---|
| Sequential by originator | 按发起者顺序处理 |
| Sequential by tenant | 按租户顺序处理 |
| Sequential | 顺序处理 |
| Burst | 突发处理 |
| Batch | 批量处理 |
配置重试策略:

| 策略 | 含义 |
|---|---|
| Retry failed and timeout | 失败与超时重试 |
| Skip all failures | 跳过所有失败 |
| Skip all failures and timeouts | 跳过所有失败和超时 |
| Retry all | 全部重试 |
| Failed retry | 失败重试 |
| Timeout retry | 超时重试 |
轮询设置:

后续在专门的队列章节还会详细讲解。
补充(辅)
- 0 = 不限制(实体数量、多数 API 配额等);演示时设为
1最容易看出拦截效果。 - 创建租户时记得绑定刚配好的 Tenant Profile,限制才会生效。
- 速率限制格式:
次数:秒数,可用逗号组合多档,如100:1,1000:60。 - 隔离队列适合集群 / 多租户资源隔离场景;单机学习可先只看实体限制部分。
