27 lines
799 B
Go
27 lines
799 B
Go
package gobridge
|
||
|
||
import (
|
||
"context"
|
||
"hash/fnv"
|
||
)
|
||
|
||
type stickyKey struct{} // 用户提供的字符串 key,acquire 时 hash 到 worker 下标
|
||
|
||
// WithSticky 将粘性键写入 ctx,相同 key 始终路由到同一 worker 进程。
|
||
//
|
||
// ctx = gobridge.WithSticky(ctx, "user-42")
|
||
// gobridge.Invoke(ctx, pool, "method", ...) // 同 key 始终走同一进程
|
||
func WithSticky(ctx context.Context, key string) context.Context {
|
||
return context.WithValue(ctx, stickyKey{}, key)
|
||
}
|
||
|
||
// workerIndexFor 根据 ctx 计算应使用的 worker 下标,无粘性键时返回 -1(交由轮询)。
|
||
func workerIndexFor(ctx context.Context, n int) int {
|
||
if key, ok := ctx.Value(stickyKey{}).(string); ok && key != "" {
|
||
h := fnv.New32a()
|
||
h.Write([]byte(key))
|
||
return int(h.Sum32()) % n
|
||
}
|
||
return -1
|
||
}
|