MST

星途 面试题库

面试题:Redis限流熔断对业务的影响及恢复策略设计

假设你正在开发一个高并发的电商秒杀系统,使用Redis实现限流熔断机制。当熔断触发后,如何设计一个合理的恢复策略,既能保证系统稳定,又能最大程度减少对业务的影响?请详细说明恢复过程中Redis数据结构的使用和操作逻辑。
16.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

恢复策略设计

  1. 固定时间窗口恢复:设定一个固定的时间窗口,比如5分钟。在熔断触发后,开始计时,当时间达到设定窗口时,尝试恢复系统。
  2. 试探性恢复:以较小的流量逐步试探系统是否恢复正常。例如,先允许10%的正常流量进入,观察系统的响应情况。如果系统运行正常,逐步增加流量比例,如每次增加10%,直到恢复到正常流量水平。

Redis数据结构使用和操作逻辑

  1. 使用Redis的String类型记录熔断状态
    • 可以使用一个键值对,例如 seckill_fuse_status,值为 0 表示未熔断,1 表示熔断。
    • 当熔断触发时,通过 SET seckill_fuse_status 1 来设置熔断状态。
  2. 使用Redis的Hash类型记录试探性恢复的流量比例
    • 创建一个Hash,键为 seckill_recovery_ratio
    • 可以设置字段如 current_ratio 来记录当前试探的流量比例,初始值设为10% 对应的数值(如0.1)。
    • 当需要调整流量比例时,通过 HSET seckill_recovery_ratio current_ratio 0.2 (假设要调整到20%)来更新。
  3. 使用Redis的Sorted Set类型记录请求时间戳
    • 创建一个Sorted Set,键为 seckill_request_timestamps
    • 在试探性恢复阶段,每次请求进来,将当前时间戳作为分数,请求标识作为成员添加到Sorted Set中,如 ZADD seckill_request_timestamps <timestamp> <request_id>
    • 可以通过计算一定时间内(如1分钟)的请求数量,与当前设定的流量比例允许的请求数量进行比较。例如,假设当前流量比例允许1分钟内100个请求,通过 ZCARD seckill_request_timestamps 获取1分钟内的请求数量,如果超过100,说明流量过大,暂停增加流量比例。
  4. 恢复过程操作逻辑
    • 固定时间窗口恢复
      • 在达到设定的时间窗口后,通过 SET seckill_fuse_status 0 将熔断状态设置为未熔断。
      • 同时,清理相关的试探性恢复的Redis数据(如Hash和Sorted Set),因为系统已进入正常运行状态。
    • 试探性恢复
      • 当时间窗口到达后,先将流量比例设置为初始试探值(如10%),即 HSET seckill_recovery_ratio current_ratio 0.1
      • 每次请求进入时,先检查 seckill_fuse_status 是否为 0,如果是则允许请求进入。同时将请求时间戳添加到 seckill_request_timestamps
      • 定时(如每分钟)检查 seckill_request_timestamps 中的请求数量是否超过当前流量比例允许的数量。如果未超过,且系统运行正常(如响应时间在合理范围内),则通过 HINCRBYFLOAT seckill_recovery_ratio current_ratio 0.1 增加流量比例。如果超过或者系统运行异常,则保持当前流量比例不变,继续观察。