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