如何将流量动态路由到指定Fargate服务实例以优化内存缓存利用率
Fargate按项目路由缓存场景的解决方案
你需要的是基于请求属性的一致性哈希流量分发策略,完全可以替代不符合需求的粘性会话方案,AWS应用负载均衡器(ALB)已经原生支持该能力:
- 你可以提前确定请求中项目标识的所在位置(比如URL路径中的项目ID、自定义请求头X-Project-Id、查询参数中的project字段等),将其作为哈希键配置ALB的负载均衡规则
- 配置完成后,所有携带同一项目标识的请求会被固定转发到同一个健康的Fargate实例,不同项目的请求会自动均匀分散到不同实例上,完全实现你想要的实例和项目绑定缓存的效果
- 当服务自动扩容新增实例时,ALB只会重新分配少部分哈希环的请求到新实例,大部分原有项目的流量仍然保持原有路由,不会出现全量缓存失效的问题
- 实例缩容时也只会影响被销毁实例对应哈希段的项目,对整体缓存命中率的影响非常小
具体配置操作:
- 先确认项目标识可以从请求的固定字段中提取,不需要解析请求Body内容
- 进入ALB绑定的ECS目标组配置页,将默认的轮询负载均衡算法修改为一致性哈希,选择你确认好的哈希键来源(路径、请求头、查询参数等)
- 配置保存后即时生效,不需要修改现有服务代码,也不需要额外引入其他组件
如果你的项目标识需要解析请求Body才能获取,ALB原生能力不支持的话,可以选择备选方案:
在ALB和Fargate服务之间部署一层自定义7层反向代理(比如Nginx、OpenResty),代理层解析请求内容拿到项目标识后,自行实现一致性哈希路由,将对应请求转发到不同的Fargate实例即可。
补充说明:即使你的项目数量远大于实例数量,该方案依然适用,多个项目会自动均匀分配到不同实例,每个实例的缓存只会存储分配到自身的项目相关内容,不会出现跨实例的缓存冗余,完全符合你扩容提升缓存容量的初衷。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

