refactor: 将 WithSticky 重命名为 StickyCtx,避免与 pool Option 的 With* 前缀冲突
This commit is contained in:
10
README.md
10
README.md
@@ -188,7 +188,7 @@ def slow_compute(n: int) -> int:
|
||||
|
||||
## Session 亲和路由
|
||||
|
||||
默认情况下,每次 `Invoke` 通过轮询分配 worker 进程。当多次调用需要共享同一 Python 进程的状态时,可以使用 Session 或 WithSticky 将调用固定到同一进程。
|
||||
默认情况下,每次 `Invoke` 通过轮询分配 worker 进程。当多次调用需要共享同一 Python 进程的状态时,可以使用 Session 或 StickyCtx 将调用固定到同一进程。
|
||||
|
||||
### NewSession
|
||||
|
||||
@@ -223,13 +223,13 @@ def step(session_id: str, delta: int) -> int:
|
||||
|
||||
> `NewSession` 不拥有底层 pool 的生命周期,调用 `session.Close()` 是空操作,只需关闭原始 pool。
|
||||
|
||||
### WithSticky
|
||||
### StickyCtx
|
||||
|
||||
`WithSticky` 将亲和键写入 ctx,相同 key 通过哈希稳定路由到同一 worker,无需持有 session 对象:
|
||||
`StickyCtx` 将亲和键写入 ctx,相同 key 通过哈希稳定路由到同一 worker,无需持有 session 对象:
|
||||
|
||||
```go
|
||||
// 每次调用前附加 key,相同 key 始终走同一 worker
|
||||
ctx = gobridge.WithSticky(ctx, "user-42")
|
||||
ctx = gobridge.StickyCtx(ctx, "user-42")
|
||||
gobridge.Invoke(ctx, pool, "method_a", ...)
|
||||
gobridge.Invoke(ctx, pool, "method_b", ...)
|
||||
```
|
||||
@@ -262,7 +262,7 @@ gobridge.Invoke(ctx, sessB, "increment", 99) // worker 0: counter = 99(独立
|
||||
|
||||
### 两种方式对比
|
||||
|
||||
| | `NewSession` | `WithSticky` |
|
||||
| | `NewSession` | `StickyCtx` |
|
||||
|---|---|---|
|
||||
| 路由方式 | 创建时轮询确定 worker | 按 key 哈希确定 worker |
|
||||
| 适用场景 | 显式会话管理 | 按自然键(用户 ID 等)路由 |
|
||||
|
||||
@@ -235,13 +235,13 @@ func demoSession(ctx context.Context, script string) {
|
||||
r, _ = gobridge.Invoke[string](ctx, sessA, "global_get")
|
||||
fmt.Println("sessA get:", r) // worker 1 counter = 15(不受 sessB 影响)
|
||||
|
||||
// ── WithSticky:相同 key 跨调用始终路由同一 worker ────────────────────
|
||||
// ── StickyCtx:相同 key 跨调用始终路由同一 worker ────────────────────
|
||||
fmt.Println()
|
||||
for i := range 4 {
|
||||
affinityCtx := gobridge.WithSticky(ctx, "sticky-key")
|
||||
affinityCtx := gobridge.StickyCtx(ctx, "sticky-key")
|
||||
msg, _ := gobridge.Invoke[string](affinityCtx, pool, "session_init",
|
||||
fmt.Sprintf("aff-%d", i), i)
|
||||
fmt.Printf("WithSticky(sticky-key) #%d → %s\n", i, msg)
|
||||
fmt.Printf("StickyCtx(sticky-key) #%d → %s\n", i, msg)
|
||||
}
|
||||
|
||||
// ── 对照组:不带亲和,轮询分配给两个 worker ─────────────────────────────
|
||||
|
||||
@@ -7,11 +7,11 @@ import (
|
||||
|
||||
type stickyKey struct{} // 用户提供的字符串 key,acquire 时 hash 到 worker 下标
|
||||
|
||||
// WithSticky 将粘性键写入 ctx,相同 key 始终路由到同一 worker 进程。
|
||||
// StickyCtx 将粘性键写入 ctx,相同 key 始终路由到同一 worker 进程。
|
||||
//
|
||||
// ctx = gobridge.WithSticky(ctx, "user-42")
|
||||
// ctx = gobridge.StickyCtx(ctx, "user-42")
|
||||
// gobridge.Invoke(ctx, pool, "method", ...) // 同 key 始终走同一进程
|
||||
func WithSticky(ctx context.Context, key string) context.Context {
|
||||
func StickyCtx(ctx context.Context, key string) context.Context {
|
||||
return context.WithValue(ctx, stickyKey{}, key)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user