Semaphore通过许可数限制并发请求实现轻量级限流,可结合失败率统计与状态切换模拟熔断,形成限流+熔断双控机制,适用于单机场景但不支持分布式限流与自适应调整。

用 Semaphore 控制高并发接口的流量,本质是用“许可数量”限制同时执行的请求数,实现轻量级限流;它不直接支持熔断,但可与熔断逻辑(如失败计数+状态切换)组合使用,形成简易限流+熔断双控机制。
一、Semaphore 实现基础限流(控制并发数)
Semaphore 是 JDK 提供的同步工具,适合控制同一时刻最多允许多少个线程进入临界区。对 HTTP 接口而言,“临界区”就是业务处理逻辑本身。
- 初始化时指定 permits(许可数),例如
new Semaphore(10)表示最多 10 个请求并行执行 - 在接口入口处调用
semaphore.tryAcquire():成功则继续处理,失败可快速返回限流响应(如 HTTP 429) - 处理完成后务必在
finally块中调用semaphore.release(),避免许可泄漏
二、配合超时与拒绝策略增强鲁棒性
单纯用 tryAcquire() 可能瞬间打满许可,建议加入等待超时和降级逻辑:
- 用
tryAcquire(1, TimeUnit.SECONDS)设置最大等待 1 秒,超时即放弃获取许可 - 获取失败时,不直接抛异常,而是返回预设降级结果(如缓存值、空响应或友好提示)
- 记录被拒绝请求数,用于后续监控或触发更高级策略(如自动扩容或告警)
三、叠加简单熔断逻辑(失败率驱动状态切换)
Semaphore 本身无熔断能力,但可借助外部状态 + 失败统计模拟熔断:
- 维护一个原子计数器(如
AtomicInteger failCount)和总请求数,每 60 秒滑动窗口计算失败率 - 当失败率 > 阈值(如 50%)且请求数达标(如 ≥20),将熔断器置为 OPEN 状态
- OPEN 状态下,所有请求直接拒绝(跳过 Semaphore 获取),持续一段时间后进入 HALF-OPEN,试探性放行少量请求验证服务是否恢复
四、注意点与适用边界
这种方案轻量、无外部依赖,适合单机场景或作为兜底限流;但它不解决分布式限流问题,也不具备 Hystrix/Sentinel 的完整生态能力:
- 多个实例间无法共享许可,需配合 Redis + Lua 或集中式限流组件实现集群限流
- 不感知下游响应时间变化,无法动态调整并发数(自适应限流需额外指标采集)
- 熔断逻辑需自行维护状态和定时任务,生产环境建议优先考虑 Sentinel 或 Resilience4j

















