Skip to content

并发限制 ⚡

网关支持对请求进行并发限制,防止系统过载,提高服务稳定性。

功能特性

  • 灵活配置:支持启用/禁用并发限制
  • 许可证控制:许可证可以限制最大并发数上限
  • 队列机制:超出并发限制的请求会进入队列等待
  • 超时处理:队列等待超时后会拒绝请求
  • 自定义响应:可配置拒绝请求时的状态码和消息

配置说明

config.yaml 中的 gateway.concurrency 部分配置并发限制:

yaml
gateway:
  # 并发限制配置
  concurrency:
    enabled: true                 # 是否启用并发限制
    max-concurrent: 1000          # 最大并发数,0表示不限制
    queue-timeout: "3m"           # 队列等待超时时间
    reject-status-code: 503       # 拒绝请求时返回的状态码
    reject-message: "Service temporarily unavailable due to high concurrency"  # 拒绝请求时返回的消息
    reject-content-type: "text/plain; charset=utf-8"  # 拒绝请求时返回的内容类型

配置参数详解

参数类型默认值说明
enabledbooleanfalse是否启用并发限制功能
max-concurrentint0最大并发数,0表示不限制
queue-timeoutstring"3m"队列等待超时时间,支持时间格式如:30s, 1m, 5m
reject-status-codeint503拒绝请求时返回的HTTP状态码
reject-messagestring"Service temporarily unavailable due to high concurrency"拒绝请求时返回的消息内容
reject-content-typestring"text/plain; charset=utf-8"拒绝请求时返回的内容类型

工作原理

  1. 请求到达:当请求到达网关时,首先检查是否启用了并发限制
  2. 并发检查:如果当前并发数未达到限制,直接处理请求
  3. 队列等待:如果达到并发限制,请求进入队列等待
  4. 超时处理:如果等待时间超过 queue-timeout,返回拒绝响应
  5. 请求完成:请求处理完成后,释放并发槽位

许可证限制

网关的许可证可能包含并发数限制,此时:

  • 许可证优先:如果许可证设置了并发限制,配置的并发数不能超过许可证限制
  • 自动调整:配置的并发数超过许可证限制时,会自动调整为许可证限制值
  • 强制启用:即使配置禁用了并发限制,许可证有限制时也会强制启用

日志示例

# 配置超过许可证限制
WARN 配置的最大并发数(2000)超过许可证限制(1000),已调整为许可证限制值

# 配置未设置但许可证有限制
INFO 配置未设置并发限制,使用许可证限制: 1000

# 配置禁用但许可证要求限制
WARN 配置禁用了并发限制,但许可证要求限制并发数为: 1000

使用示例

基础配置

yaml
gateway:
  concurrency:
    enabled: true
    max-concurrent: 500
    queue-timeout: "30s"

高并发场景

yaml
gateway:
  concurrency:
    enabled: true
    max-concurrent: 2000
    queue-timeout: "1m"
    reject-status-code: 429
    reject-message: "Too Many Requests"

开发环境(禁用限制)

yaml
gateway:
  concurrency:
    enabled: false

监控指标

当启用监控功能时,可以观察以下指标:

  • 当前并发数:实时并发请求数量
  • 队列长度:等待处理的请求数量
  • 拒绝请求数:因并发限制被拒绝的请求数量
  • 平均等待时间:请求在队列中的平均等待时间

性能建议

并发数设置

  • CPU密集型应用:建议设置为 CPU 核心数的 1-2 倍
  • IO密集型应用:可以设置更高的并发数
  • 内存限制:考虑每个请求的内存占用

超时时间设置

  • 快速响应:对于要求快速响应的API,设置较短的超时时间(如 10s-30s)
  • 批处理:对于批处理类请求,可以设置较长的超时时间(如 5m-10m)

状态码选择

  • 503 Service Unavailable:服务暂时不可用(默认)
  • 429 Too Many Requests:请求过多,建议客户端重试
  • 500 Internal Server Error:内部服务器错误

故障排查

常见问题

  1. 请求被频繁拒绝

    • 检查并发数设置是否过低
    • 观察实际请求量和处理能力
    • 考虑增加并发数或优化后端服务
  2. 队列等待时间过长

    • 检查后端服务响应时间
    • 考虑减少超时时间或增加并发数
    • 优化后端服务性能
  3. 许可证限制冲突

    • 检查许可证并发限制
    • 联系技术支持升级许可证
    • 调整配置以符合许可证限制

日志级别

建议在生产环境中将日志级别设置为 infowarn,以便观察并发限制的工作状态。

yaml
log:
  level: info

注意事项

  1. 资源消耗:并发限制会消耗一定的内存和CPU资源
  2. 配置更新:支持通过Nacos动态更新配置,无需重启服务
  3. 许可证限制:许可证限制具有最高优先级,无法通过配置绕过
  4. 监控重要性:建议启用监控功能,实时观察并发状态
  5. 测试验证:在生产环境使用前,建议在测试环境进行充分验证