API 限制
API 和速率限制功能允许通过限制单个时间单位(分钟、小时等)内单个主机/设备/租户的请求数量来控制 API 使用。
REST API 限制
REST API 调用由各种 UI 组件以及可能代表客户用户或租户用户启动的一些自动脚本使用。限制租户或客户的 API 调用量至关重要,以避免由于自定义小部件或脚本中的错误而导致服务器过载。
rest.limits.tenant.enabled参数或YICONNECT_SERVER_REST_LIMITS_TENANT_ENABLED环境属性启用/禁用租户级别限制。
rest.limits.tenant.configuration参数或YICONNECT_SERVER_REST_LIMITS_TENANT_CONFIGURATION环境属性配置 REST API 调用的最大数量 。 例如,值“100:1,2000:60”表示每秒不超过 100 个请求,每分钟不超过 2000 个请求。
server:
...
rest:
limits:
tenant:
enabled: "${YICONNECT_SERVER_REST_LIMITS_TENANT_ENABLED:false}"
configuration: "${YICONNECT_SERVER_REST_LIMITS_TENANT_CONFIGURATION:100:1,2000:60}"
customer:
enabled: "${YICONNECT_SERVER_REST_LIMITS_CUSTOMER_ENABLED:false}"
configuration: "${YICONNECT_SERVER_REST_LIMITS_CUSTOMER_CONFIGURATION:50:1,1000:60}"
Websocket 限制
Websocket 用于将有关新遥测值的实时通知从设备传递到仪表板。
ws.send_timeout参数或YICONNECT_SERVER_WS_SEND_TIMEOUT环境属性控制将 Websocket 消息成功传递到客户端的最长时间 。 如果客户端太慢,会话将被关闭。
ws.limits.max_queue_per_ws_session参数或YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_QUEUE_PER_WS_SESSION 环境属性控制等待传递到客户端的最大消息数 。 如果客户端太慢,会话将被关闭。
ws.limits.max_sessions_per_ 参数或 YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_ 环境属性控制每个特定实体(租户、客户、公共或常规用户)的最大活动连接数。如果按照特定标准存在太多会话,则新连接将被丢弃。
ws.limits.max_subscriptions_per_ 参数或 YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_ 环境属性控制每个特定实体(租户、客户、公共或普通用户)的所有会话中的最大活动订阅量。如果符合特定条件的订阅过多,则将不接受新订阅。
ws.limits.max_updates_per_session参数或YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_UPDATES_PER_SESSION环境属性配置每个 会话从服务器发送到客户端的最大消息量。例如,值“300:1,3000:60”表示每秒不超过 300 次更新,每分钟不超过 3000 次更新。
您可以在下面找到示例配置:
server:
...
ws:
send_timeout: "${YICONNECT_SERVER_WS_SEND_TIMEOUT:5000}"
limits:
# Limit the amount of sessions and subscriptions available on each server. Put values to zero to disable particular limitation
max_sessions_per_tenant: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_TENANT:0}"
max_sessions_per_customer: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_CUSTOMER:0}"
max_sessions_per_regular_user: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_REGULAR_USER:0}"
max_sessions_per_public_user: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SESSIONS_PER_PUBLIC_USER:0}"
max_queue_per_ws_session: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_QUEUE_PER_WS_SESSION:500}"
max_subscriptions_per_tenant: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_TENANT:0}"
max_subscriptions_per_customer: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_CUSTOMER:0}"
max_subscriptions_per_regular_user: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_REGULAR_USER:0}"
max_subscriptions_per_public_user: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_SUBSCRIPTIONS_PER_PUBLIC_USER:0}"
max_updates_per_session: "${YICONNECT_SERVER_WS_TENANT_RATE_LIMITS_MAX_UPDATES_PER_SESSION:300:1,3000:60}"
数据库速率限制
尽管我们限制用户的 REST API 调用数量,但某些调用可能会产生多个数据库查询。类似地,规则链在消息处理过程中也可能会引起大量的查询。单次遥测上传还会导致数据库查询将数据写入数据库。
您可以指定 Cassandra DB 的限制,还可以指定打印统计信息的参数。例如:
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 次。
# 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.rate_limits.tenant.configuration参数或YICONNECT_TRANSPORT_RATE_LIMITS_TENANT环境属性配置每个租户的所有设备的最大消息量 。 例如,值“1000:1,20000:60”表示每秒不超过 1000 条消息,每分钟不超过 20000 条更新。
Transport.rate_limits.tenant.configuration参数或YICONNECT_TRANSPORT_RATE_LIMITS_DEVICE环境属性配置来自单个设备的最大消息量。例如,值“10:1,300:60”表示每秒不超过 10 条消息,每分钟不超过 300 条更新。
transport:
...
rate_limits:
enabled: "${YICONNECT_TRANSPORT_RATE_LIMITS_ENABLED:false}"
tenant: "${YICONNECT_TRANSPORT_RATE_LIMITS_TENANT:1000:1,20000:60}"
device: "${YICONNECT_TRANSPORT_RATE_LIMITS_DEVICE:10:1,300:60}"