首页 > 试题广场 >

58线上服务监控系统每次抛出一个 Exception 都会发

[问答题]

58 线上服务监控系统每次抛出一个 Exception 都会发送一条报警短信。现在由于短时报警太多导致技术人员手机爆掉,因此需要给每种 Exception 配置一定的配额 M ,在一段时间 T 内(如 1h ),如果某种异常的发生次数超过了配额,就不再报警了。请设计一个模块,该模块提供一个接口,判断每种类型异常是否可发送报警短信(异常类型可用 int 型表示)。给出设计思路、实现方案和核心数据结构。

1

方案 1 :使用 hashtable 存储发生次数、 key 为异常类型、 value 为以下结构:

struct node {

uint8_t head_pos;//ts 数组中最早时间戳下标

uint8_t tail_pos;//ts 数组中最晚时间戳下标

uint32_t lock_to_time;// 正常情况下为 0 ,配额超限后存储锁定时间

uint32_t ts[20];// 循环数组,存储最近 M 次异常发生时间戳

};

利用循环数组 ts 记录最近 M 次异常发生时间戳, head_pos tail_pos 记录循环数组中最早的时间戳下标和最晚的时间戳下标。异常发生时判断最近 M 次异常是否发生在最近时间周期 T 内,如果是的话则触发限制机制,将 lock_to_time 设置为当前时间 +T 。下次再登录时需要判断当前时间是否超过 lock_to_time ,如果没有超过限制发送报警短信,超过后可以将节点数据清零。

方案 2 :使用循环数组过于占用内存,容易受次数增大的影响。不要求绝对精确,可只记录异常发生次数和起始时间戳,每周期 T 重置。

struct node {

uint32_t except_time;// 初次异常发生时间

uint32_t except_count;// 异常发生次数

};

每次判断时,若当前时间超过 except_time+T 则把 except_time 重置为当前时间并把 except_count 重置为 0. 检测 except_count ,若超限则禁止发送短信,不计次数,未超限则 except_count+=1 ,允许发送短信。

这道题你会答吗?花几分钟告诉大家答案吧!