weapons97/shmem-limiter

shmem-limiter

★ 0Forks 0CGitHub ↗Compare

README

shmem-limiter

基于 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

API

底层令牌桶 (token_bucket.h)

函数 说明
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.h)

函数/宏 说明
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

License

MIT

Issues