FlowGate - 3D concurrency limiter with event hooks for MoonBit
moon add flowgatelet gate = @flowgate.new_builder()
.global(100) // 全局最大并发 100
.per_key(10) // 每个 key 最多 10
.per_session(5) // 每个 session 最多 5
.queue_size(200) // 等待队列 200(0 = 不排队)
.on_block(fn(reason) { println("BLOCKED: " + reason) })
.on_acquire(fn(key, session, msg) { /* 埋点 */ })
.build()
match gate.acquire("tool-1", "user-abc") {
Ok(msg) => { /* 执行业务 */; gate.release("tool-1", "user-abc") }
Err(e) => println(e) // REJECTED 或 QUEUED
}let dev = @flowgate.permissive_gate() // 500 / 50 / 20
let prod = @flowgate.default_gate() // 100 / 10 / 5
let strict = @flowgate.strict_gate() // 50 / 3 / 2| 方法 | 说明 |
|---|---|
| new_builder() | 创建 Builder |
| .global(n) | 全局并发上限 |
| .per_key(n) | 每 key 并发上限 |
| .per_session(n) | 每 session 并发上限 |
| .queue_size(n) | 队列容量(0 = 满则拒) |
| .on_block(fn) | 被拒/排队回调 |
| .on_acquire(fn) | 获得槽位回调 |
| .on_release(fn) | 释放槽位回调 |
| .build() | 构建 FlowGate |
| gate.acquire(key, session) | 申请 → Ok / Err |
| gate.release(key, session) | 释放槽位 |
| gate.available() | 剩余槽位数 |
| gate.is_full() | 是否满 |
| gate.stats() | 统计字符串 |
请求到达
│
├─ 1. 全局上限检查 ← global_active >= max_global ? 拒绝/排队
├─ 2. 键上限检查 ← key "tool-a" active >= per_key ? 拒绝/排队
├─ 3. 会话上限检查 ← session "user-1" active >= per_session ? 拒绝/排队
│
└─ 全部通过 → 计数+1 → 返回 OkFlowGate - 3D concurrency limiter with event hooks for MoonBit