跳转到主要内容

概要

  • 速率限制按用户计算,覆盖该用户所有并发 WebSocket 连接。
  • 限额为每 60 秒 12,000 个权重单位。
  • 使用**指数移动平均(EMA)**模型平滑突发流量,而非简单的每秒计数器。
  • 每位用户有两个相互独立的限流桶:
    • 通用桶:用于订单、查询、订阅等。
    • 撤单桶:用于撤单相关消息。
  • 每类消息有内部权重。较重的操作(例如下单)比轻量操作(例如订阅)消耗更多额度。
为保护系统稳定性,限额与权重可能变化。请始终妥善处理 RateLimited 响应,不要假定吞吐量固定不变。

消息权重

当前值如下: 当前限额为每 60 秒 12,000 单位(每秒 200 单位)。一条 add_order(权重 1.0)消耗 1 单位,因此可持续提交约每秒 200 笔订单。

限制适用范围

这些限制适用于成功认证后的 WebSocket 入站消息。HTTP 接口及首次 WebSocket 握手可能适用独立控制。

工作原理

系统维护您的加权消息速率 EMA。每条入站消息增加其权重;消息之间,EMA 自动衰减。
  • 某个限流桶的 EMA 超过允许阈值时,该桶下一条消息会被拒绝,并返回 RateLimited。
  • 错误包含**重试等待时间(retry-after)**提示,帮助客户端判断何时可以再次尝试。
由于撤单使用独立限流桶,即使通用桶暂时耗尽,通常仍可撤单,但仍须遵守撤单桶自身限额。

按用户计算,跨连接共享

多个 WebSocket 连接的流量会汇总到同一用户的额度中,即一个通用额度和一个撤单额度。增加连接数量不会提高有效限额。

可能收到的错误

消息被限流时,WebSocket 会收到单播错误:
使用 retry after 值作为重发时机的参考。

客户端最佳实践

  1. 带随机抖动的退避:收到 RateLimited 后,等待建议秒数,再加少量随机抖动(例如 50–200 毫秒)后重试,避免大量客户端同时重试。
  2. 合并与批量处理:尽量发送数量较少、目标明确的消息,而不是大量零碎消息,尤其是改单。
  3. 遵守撤单额度:独立撤单额度有助于快速降低风险,但不是无限额度,请避免撤单突发风暴。
  4. 错开各连接突发流量:多个连接共享用户额度,应错开突发请求。
  5. 幂等性:在支持的接口中使用客户端订单 ID,避免首次请求已在服务端成功时,重试产生重复订单。
  6. 管理订阅:订阅权重较低但并非免费,不要短时间内反复订阅和取消订阅。

常见问题

限额按 IP 还是 API 密钥计算? 按用户计算。属于同一用户的多个 API 密钥共享额度。 读取请求是否计入限额? 是,但权重低于写入操作。 是否允许突发流量? EMA 平滑允许短时突发,但持续超过阈值会触发限流。 能否申请提高限额? 生产业务确实需要更高吞吐量时,请联系我们讨论专用配额。

变更政策

为维持平台可靠性,我们可能不定期调整限流阈值和消息权重。只要集成按上述方式处理 RateLimited 响应并实施退避,这类变更无需客户端更新。