feng-y opened a new issue, #3228:
URL: https://github.com/apache/brpc/issues/3228
**Is your feature request related to a problem?**
使用 backup request 时,如果下游服务出现短暂延迟抖动,可能在短时间内触发大量 backup 请求,额外增加下游负载,加剧抖动。
目前 `BackupRequestPolicy` 提供了 `DoBackup()`
接口供用户自行决策,但框架没有提供开箱即用的比例控制实现。用户需要自行处理滑动窗口统计和线程安全。
**Describe the solution you'd like**
新增内置的 `RateLimitedBackupPolicy`,限制滑动窗口内 backup 请求占总请求的比例。
核心设计:
- 复用 `bvar::Adder` + `bvar::Window` 做滑动窗口统计(lock-free,与 `auto_cl_*`
系列一致的技术选型)
- `OnRPCEnd()` 累加 total 计数,`DoBackup()` 返回 true 时累加 backup 计数
- 超比例时 `DoBackup()` 返回 false,跳过本次 backup
- 冷启动(窗口内 total == 0)时允许 backup
配置方式(沿用 gflags 风格):
```cpp
DEFINE_double(backup_request_max_ratio, -1,
"Max ratio of backup requests to total requests. "
"Valid range: (0, 1]. -1 (default) disables ratio limiting. "
"e.g. 0.05: at most 5% of requests will trigger backup.");
DEFINE_int32(backup_request_ratio_window_size_s, 10,
"Sliding window size in seconds for calculating backup request
ratio.");
```
同时在 `ChannelOptions` 中增加 `backup_request_max_ratio` 字段供 per-channel 覆盖。
默认 -1,完全向后兼容。
用法示例:
```cpp
// 方式 1:gflags
--backup_request_max_ratio=0.05
// 方式 2:per-channel
brpc::ChannelOptions options;
options.backup_request_ms = 100;
options.backup_request_max_ratio = 0.05;
channel.Init("http://...", &options);
```
**Describe alternatives you've considered**
1. 简单计数器 + 定期重置:窗口边界处有毛刺
2. EWMA:无边界问题但参数调节复杂、语义不够直观
3. 概率性降级:更平滑但无法硬保证比例
`bvar::Window` 方案在 brpc 内已广泛使用,实现简洁且约 1 秒采样延迟对比例控制完全可接受。
**Additional context**
文件变更范围:`backup_request_policy.h/cpp`、`channel.h/cpp`、测试。
如果方向没问题,我可以提交 PR 实现。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]