基于 POSIX 共享内存的跨进程令牌桶限速库。外部监控进程根据指标差值动态补充令牌,被限速进程通过阻塞或非阻塞方式消费令牌。
- 跨进程共享 — 令牌桶状态通过 POSIX 共享内存 (
shm_open) 管理,多个进程天然共享同一令牌桶 - 无锁原子操作 — 基于 C11
_Atomic实现令牌的补充与消费,无需互斥锁 - 外部补充模型 — 桶本身不自动补充令牌,由监控进程通过
tb_refill/tb_set_tokens按需注入,适配自定义调度策略 - 灵活的获取方式 — 支持阻塞获取、非阻塞获取、带超时获取
- 宏包装拦截 —
INTERCEPTOR_LAUNCH宏可包装任意函数调用,在执行前自动等待令牌 - 桶容量可动态调整 —
tb_set_burst支持运行时修改上限,burst=0表示无上限
make # Debug 构建
make rebuild # 清理后重新构建需要 CMake >= 3.14 和 C11 编译器。Linux 下自动链接 rt 库,macOS 无需额外依赖。
#include "interceptor.h"
// 初始化限速器:0 个初始令牌,桶容量 10
interceptor_ctx_t ctx;
interceptor_init(&ctx, "/my_limiter", 0, 10);
// 监控进程补充令牌
interceptor_refill(&ctx, 3); // 累加 3 个令牌
interceptor_set_tokens(&ctx, 5); // 直接设为 5 个令牌
// 被限速进程调用函数
INTERCEPTOR_LAUNCH(&ctx, some_func, arg1, arg2); // 阻塞等待令牌后执行
INTERCEPTOR_LAUNCH_TRY(&ctx, some_func, arg1, arg2); // 非阻塞,令牌不足则跳过
// 清理
interceptor_destroy(&ctx);
interceptor_cleanup("/my_limiter"); // 删除共享内存父进程补充令牌,多个子进程共享同一令牌桶:
./build/examples/multi_process| 函数 | 说明 |
|---|---|
tb_create(name, init_tokens, burst) |
创建/打开共享内存令牌桶 |
tb_close(tb) |
关闭映射 |
tb_unlink(name) |
删除共享内存 |
tb_refill(tb, n) |
补充 n 个令牌(累加,上限 max_tokens) |
tb_set_tokens(tb, n) |
直接设置令牌数(上限 max_tokens) |
tb_try_acquire(tb, n) |
非阻塞获取 n 个令牌 |
tb_acquire(tb, n) |
阻塞获取 n 个令牌 |
tb_acquire_timeout(tb, n, sec) |
带超时获取 n 个令牌 |
tb_available(tb) |
查询当前可用令牌数 |
tb_set_burst(tb, burst) |
动态调整桶容量 |
| 函数/宏 | 说明 |
|---|---|
interceptor_init(ctx, name, init, burst) |
初始化限速上下文 |
interceptor_destroy(ctx) |
销毁上下文 |
interceptor_cleanup(name) |
删除共享内存 |
interceptor_refill(ctx, n) |
补充令牌 |
interceptor_set_tokens(ctx, n) |
设置令牌数 |
interceptor_set_burst(ctx, burst) |
调整桶容量 |
interceptor_wait(ctx) |
阻塞获取 1 个令牌 |
interceptor_try(ctx) |
非阻塞获取 1 个令牌 |
interceptor_wait_timeout(ctx, sec) |
带超时获取 1 个令牌 |
INTERCEPTOR_LAUNCH(ctx, fn, ...) |
阻塞等待令牌后执行函数 |
INTERCEPTOR_LAUNCH_TRY(ctx, fn, ...) |
非阻塞,令牌不足则跳过 |
├── include/
│ ├── token_bucket.h # 底层令牌桶 API
│ └── interceptor.h # 拦截器 API 与便捷宏
├── src/
│ └── token_bucket.c # 令牌桶实现
├── examples/
│ ├── basic_limiter.c # 基本限速示例
│ ├── multi_process.c # 多进程限速示例
│ └── set_tokens.c # set_tokens 功能测试
├── CMakeLists.txt
└── Makefile
MIT