StickyHeader 是用于 traefik 的一个插件,它可以根据 header 实现 sticky session
traefik 使用 cookie 实现 sticky session,且默认不支持基于 header 的会话保持能力(例如 IP Hash)。 但是有些业务场景需要根据 header 做会话保持。例如,vllm 等大模型推理服务的 prefix-caching 特性,希望将同一个用户的请求转发到同一个 vllm pod,这样可以提高 gpu 中的 kv cache命中率。
因此,此插件使用一个本地的 lru cache,存储请求中设置的 header 到 traefik 设置的 cookie 之间的映射关系,这样就可以将 traefik 基于 cookie 实现的会话保持能力,转换成基于请求 header 的会话保持能力。
- 由于 yaegi 暂时不支持 Go modules,因此需要先将仓库的依赖下载到本地 vendor 目录下
go mod tidy
go mod download
go mod vendor
- 启动服务
cd demo
docker-compose up -d
同时,也可以在 traefik dashboard 看到这条路由成功应用上了这个插件
- 测试基于 header 的会话保持能力
bash req.sh
修改 header 中的 X-USER-ID 的值,从响应结果中观察是否切换了一个 whoami pod。
由于采用了本地的 lru cache,所以插件变成了有状态服务,因此,无法设置多个traefik pod副本(在k8s集群中部署的情况),如果需要使用多个 traefik pod副本,需要把这里的 lru cache 改成 Redis 这类共享缓存。