跳转至

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}"