限流核心概念
在催收系统中,API 网关每天需要处理来自不同渠道(电话外呼、短信、微信、邮件、App 推送)的数千万次请求。如果没有流量控制,一次突发催收活动就可能压垮后端服务。本节将系统讲解限流的核心概念、目的以及与背压的本质区别。
什么是限流
限流(Rate Limiting)是一种通过控制单位时间内允许通过的请求数量,来保护系统不被突发流量冲垮的机制。它本质上是一个“流量阀门”,在请求到达后端服务之前进行拦截和排队。
核心定义:限流 = 限制请求速率 ≤ 系统处理能力 × 安全系数
限流通常作用于以下三个层面:
| 层面 | 控制对象 | 催收场景示例 |
|---|---|---|
| 接入层 | 客户端 IP、API Key | 单个催收员客户端每秒最多发起 10 次查询 |
| 业务层 | 用户 ID、订单 ID | 同一借款人每天最多接收 3 次催收通知 |
| 资源层 | 数据库连接、线程池 | 催收任务队列每秒最多消费 500 条 |
限流的目的
1. 保护系统
催收系统在特定时段(如月初还款日、批量催收任务启动时)会遭遇流量洪峰。限流的核心目的是防止系统过载崩溃:
- 防止资源耗尽:限制数据库连接数、线程池使用量,避免 OOM 或连接池枯竭
- 避免级联故障:单个服务过载不扩散到依赖链上的其他服务
- 保障核心链路:优先保障还款查询、借款人信息核验等高优先级 API
实战经验:某催收平台在月初还款日未配置限流,导致 10 万并发查询请求瞬间打满数据库连接池,核心还款接口响应时间从 50ms 飙升到 30s,最终引发 30 分钟服务不可用。配置限流后,即使流量翻倍,核心接口依然稳定在 200ms 以内。
2. 公平服务
限流确保所有调用方都能获得公平的服务质量,防止某个“吵闹邻居”抢占全部资源:
| 场景 | 无限流 | 有限流 |
|---|---|---|
| 批量催收任务 | 占用 90% 线程池,导致实时查询超时 | 限制批量任务速率,保障实时接口可用 |
| 第三方渠道接入 | 某个渠道异常重试,挤占其他渠道额度 | 按渠道分配配额,互不影响 |
| 内部测试流量 | 压测流量影响生产用户 | 测试账号单独限流,隔离生产流量 |
限流与背压的区别
限流和背压(Backpressure)都是流量控制手段,但它们的控制维度和作用时机有本质区别。很多开发者容易混淆这两个概念,下面通过对比表格和示意图来厘清:
| 对比维度 | 限流(Rate Limiting) | 背压(Backpressure) |
|---|---|---|
| 控制位置 | 请求入口(上游) | 消费端(下游) |
| 触发条件 | 速率超过预设阈值 | 消费者处理能力不足 |
| 反馈方式 | 直接拒绝(返回 429) | 反向压力信号(减慢发送) |
| 数据丢失 | 丢弃超限请求 | 不丢失,缓冲或延迟处理 |
| 适用场景 | API 网关、外部接口 | 消息队列、流处理系统 |
| 催收示例 | 限制每秒最多 1000 次催收查询 | 催收任务队列消费慢时,生产者等待 |
常见误区:不要把限流和背压混为一谈。限流是“我不让你进来”,背压是“你慢点发,我还能接”。在催收系统中,对于外部 API 调用(如第三方征信查询)使用限流;对于内部消息队列(如催收任务分发)使用背压。两者配合使用才能构建完整的流量控制体系。
限流在催收系统中的典型应用
结合催收业务场景,限流策略通常按以下维度实施:
- 按 API 维度:查询借款人信息 1000 次/秒,发送催收短信 200 条/秒
- 按用户维度:单个催收员 50 次/秒,单个借款人 5 次/分钟
- 按渠道维度:电话外呼渠道 100 次/秒,微信渠道 50 次/秒
- 按时段维度:工作日 9:00-21:00 放开限流,夜间收紧至 10%
限流阈值设定原则:限流阈值 = 系统最大处理能力 × 0.7(安全系数)。例如数据库最大支持 2000 QPS,则限流设为 1400 QPS,预留 30% 的缓冲空间应对瞬时波动。