API&RateLimits功能通过限制单个host/device/tenant在单位时间(分钟、小时等)内的请求数来控制API使用量。
API&RateLimits默认关闭。系统管理员可通过thingsboard.yml配置速率限制。
REST API限制
RESTAPI调用被各类UI组件及可能代表客户用户或租户用户运行的自动脚本使用。 限制租户或客户的API调用量至关重要,以避免因自定义部件或脚本错误导致服务器过载。
rest.limits.tenant.enabled 参数或 TB_SERVER_REST_LIMITS_TENANT_ENABLED 环境变量用于启用/禁用租户级限制。
rest.limits.tenant.configuration 参数或 TB_SERVER_REST_LIMITS_TENANT_CONFIGURATION 环境变量用于配置RESTAPI调用的最大数量。 例如,值”100:1,2000:60”表示每秒不超过100次请求、每分钟不超过2000次请求。
1
2
3
4
5
6
7
8
9
10
server:
...
rest:
limits:
tenant:
enabled: "${TB_SERVER_REST_LIMITS_TENANT_ENABLED:false}"
configuration: "${TB_SERVER_REST_LIMITS_TENANT_CONFIGURATION:100:1,2000:60}"
customer:
enabled: "${TB_SERVER_REST_LIMITS_CUSTOMER_ENABLED:false}"
configuration: "${TB_SERVER_REST_LIMITS_CUSTOMER_CONFIGURATION:50:1,1000:60}"
WebSocket限制
WebSocket用于将设备的新遥测值实时推送到仪表板。
ws.send_timeout 参数或 TB_SERVER_WS_SEND_TIMEOUT 环境变量控制WebSocket消息成功送达客户端的最大时间。若客户端过慢,会话将被关闭。
ws.limits.max_queue_per_ws_session 参数或 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_QUEUE_PER_WS_SESSION 环境变量控制等待发送给客户端的最大消息数。若客户端过慢,会话将被关闭。
ws.limits.max_sessions_per_* 参数或 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_* 环境变量控制每类实体(tenant、customer、public或regularuser)的最大活动连接数。 若某类实体的会话数过多,新连接将被拒绝。
ws.limits.max_subscriptions_per_* 参数或 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_* 环境变量控制每类实体所有会话中的最大活动订阅数。 若某类实体的订阅数过多,将不再接受新订阅。
ws.limits.max_updates_per_session 参数或 TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_UPDATES_PER_SESSION 环境变量配置每个会话从服务器发送给客户端的最大消息数。 例如,值”300:1,3000:60”表示每秒不超过300次更新、每分钟不超过3000次更新。
示例配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
...
ws:
send_timeout: "${TB_SERVER_WS_SEND_TIMEOUT:5000}"
limits:
# 限制每台服务器上可用的会话数量和订阅数。将值设置为零以禁用特定限制
max_sessions_per_tenant: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_TENANT:0}"
max_sessions_per_customer: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_CUSTOMER:0}"
max_sessions_per_regular_user: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_REGULAR_USER:0}"
max_sessions_per_public_user: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_PUBLIC_USER:0}"
max_queue_per_ws_session: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_QUEUE_PER_WS_SESSION:500}"
max_subscriptions_per_tenant: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_TENANT:0}"
max_subscriptions_per_customer: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_CUSTOMER:0}"
max_subscriptions_per_regular_user: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_REGULAR_USER:0}"
max_subscriptions_per_public_user: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_PUBLIC_USER:0}"
max_updates_per_session: "${TB_SERVER_WS_TENANT_RATE_LIMITS_MAX_UPDATES_PER_SESSION:300:1,3000:60}"
数据库速率限制
尽管已对RESTAPI调用量进行限制,但部分调用可能产生多次数据库查询。规则链在消息处理期间同样可能产生大量查询。 单次telemetry上传也会产生数据库查询以将数据写入DB。
可针对CassandraDB指定限制,并可配置打印统计信息的参数。例如:
2018-11-29 10:51:25,020 [SockJS-1] INFO o.t.s.d.n.CassandraBufferedRateExecutor -
Permits queueSize [0] totalAdded [6395] totalLaunched [6395] totalReleased [6396] totalFailed [0] totalExpired [0]
totalRejected [0] totalRateLimited [0] totalRateLimitedTenants [0] currBuffer [0]
可选:可配置打印超出阈值的租户名称。
cassandra.query.tenant_rate_limits.configuration 参数或 CASSANDRA_QUERY_TENANT_RATE_LIMITS_CONFIGURATION 环境变量用于配置每个租户的最大查询数。 例如,值”1000:1,30000:60”表示每秒不超过1000次更新、每分钟不超过30000次更新。
1
2
3
4
5
6
7
8
9
10
11
# Cassandra driver configuration parameters
cassandra:
...
# Cassandra cluster connection query parameters
query:
...
rate_limit_print_interval_ms: "${CASSANDRA_QUERY_RATE_LIMIT_PRINT_MS:10000}"
tenant_rate_limits:
enabled: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_ENABLED:false}"
configuration: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_CONFIGURATION:1000:1,30000:60}"
print_tenant_names: "${CASSANDRA_QUERY_TENANT_RATE_LIMITS_PRINT_TENANT_NAMES:false}"
传输速率限制
限制来自单个设备或某租户下所有设备的消息数量非常重要。 此限制在transport层生效,在消息推送到规则引擎之前应用。
transport.rate_limits.tenant.configuration 参数或 TB_TRANSPORT_RATE_LIMITS_TENANT 环境变量用于配置每个租户所有设备的最大消息数。 例如,值”1000:1,20000:60”表示每秒不超过1000条消息、每分钟不超过20000次更新。
transport.rate_limits.device.configuration 参数或 TB_TRANSPORT_RATE_LIMITS_DEVICE 环境变量用于配置单个设备的最大消息数。 例如,值”10:1,300:60”表示每秒不超过10条消息、每分钟不超过300次更新。
1
2
3
4
5
6
transport:
...
rate_limits:
enabled: "${TB_TRANSPORT_RATE_LIMITS_ENABLED:false}"
tenant: "${TB_TRANSPORT_RATE_LIMITS_TENANT:1000:1,20000:60}"
device: "${TB_TRANSPORT_RATE_LIMITS_DEVICE:10:1,300:60}"