Files
gobridge/sticky.go

27 lines
796 B
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package gobridge
import (
"context"
"hash/fnv"
)
type stickyKey struct{} // 用户提供的字符串 keyacquire 时 hash 到 worker 下标
// StickyCtx 将粘性键写入 ctx相同 key 始终路由到同一 worker 进程。
//
// ctx = gobridge.StickyCtx(ctx, "user-42")
// gobridge.Invoke(ctx, pool, "method", ...) // 同 key 始终走同一进程
func StickyCtx(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
}