面试题答案
一键面试恢复策略设计
- 固定时间窗口恢复:设定一个固定的时间窗口,比如5分钟。在熔断触发后,开始计时,当时间达到设定窗口时,尝试恢复系统。
- 试探性恢复:以较小的流量逐步试探系统是否恢复正常。例如,先允许10%的正常流量进入,观察系统的响应情况。如果系统运行正常,逐步增加流量比例,如每次增加10%,直到恢复到正常流量水平。
Redis数据结构使用和操作逻辑
- 使用Redis的String类型记录熔断状态:
- 可以使用一个键值对,例如
seckill_fuse_status
,值为0
表示未熔断,1
表示熔断。 - 当熔断触发时,通过
SET seckill_fuse_status 1
来设置熔断状态。
- 可以使用一个键值对,例如
- 使用Redis的Hash类型记录试探性恢复的流量比例:
- 创建一个Hash,键为
seckill_recovery_ratio
。 - 可以设置字段如
current_ratio
来记录当前试探的流量比例,初始值设为10% 对应的数值(如0.1)。 - 当需要调整流量比例时,通过
HSET seckill_recovery_ratio current_ratio 0.2
(假设要调整到20%)来更新。
- 创建一个Hash,键为
- 使用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,说明流量过大,暂停增加流量比例。
- 创建一个Sorted Set,键为
- 恢复过程操作逻辑:
- 固定时间窗口恢复:
- 在达到设定的时间窗口后,通过
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
增加流量比例。如果超过或者系统运行异常,则保持当前流量比例不变,继续观察。
- 当时间窗口到达后,先将流量比例设置为初始试探值(如10%),即
- 固定时间窗口恢复: