第 282 题:实现模型服务的负载均衡,一致性哈希与故障转移。
题目
实现模型服务的负载均衡,一致性哈希与故障转移。
完整讲解
一、模型服务的负载均衡
- 多实例部署时,请求需均衡分配到各实例,避免单点过载;同时希望同一用户/请求尽量落同一实例(局部性、缓存友好)。常用一致性哈希做有状态路由,并配合故障转移保证可用性。
二、一致性哈希
- 思路:将 hash 空间(如 0~2^32-1)视为环,每个节点(实例)映射到环上若干点(虚拟节点);每个请求的 key(如 user_id)哈希到环上一点,顺时针找到第一个节点即为目标。增删节点时仅影响相邻区间,迁移量小。
- 实现:维护有序的节点列表(按 hash 值),对 key 的 hash 做二分查找「第一个 ≥ hash 的节点」;虚拟节点(每物理节点多个 token)可提高均衡度。可选带权(按实例能力分配虚拟节点数)。
- 局部性:同一 key 始终落同一节点,便于该 key 的缓存与状态;适合「按 user_id 路由」的推荐推理。
三、故障转移
- 健康检查:定期探测实例存活与延迟,标记不健康节点并从哈希环中临时摘除(或降权),流量不再打到该节点。
- 重试与降级:请求失败时重试其他节点或返回降级结果(如默认排序、缓存结果);超时也视为失败并转移。
- 会话与状态:若实例有本地状态,故障时需将流量与状态迁移到其他节点,或使用外部存储(Redis/DB)存状态,故障后由新节点加载。推荐模型服务多为无状态,故障转移主要做摘除与重试即可。
面试要点
- 能说清一致性哈希的原理(环、虚拟节点、key 顺时针找节点)及为何适合负载均衡与局部性。
- 能说明故障转移:健康检查、摘除、重试与降级;无状态 vs 有状态时的差异。
记忆要点
- 负载均衡:一致性哈希(环+虚拟节点),同一 key 落同节点,利于缓存与局部性。
- 故障转移:健康检查、摘除故障节点、重试/降级;无状态只需摘除+重试。