利用网关实现接口并发调用次数的可配置化监控、告警方案

1、需求概述:

用户在管理后台设置告警规则,主要是设置哪些接口进行监控,以及告警的阈值,不同等级的告警有不同的阈值;
当达到用户设置的阈值时,发送告警信息;系统默认并发时间是10秒内;用户对告警规则的设定包含了增删改查,以及告警规则状态生效失效的操作。

2、背景介绍:

做一个项目的监控告警功能,这个很泛,可大可小。之前调研我们考虑了第三方开源的zabbix、Prometheus、CAT等工具,最后由于时间紧,把接口并发次数监控的需求拿掉了。这里把之前的一些实现想法方案记录下,后面如果再做这个需求,再发一个完整的实现博客。

3、实现思路:

a.用户在新增告警规则的时候,将大小为阈值的队列扔到redis中,key按照一定规则定义(如请求路径 + 告警级别),方便后面在网关拦截器中可以取到。

b.增加一个类似于网关的模块,将所有外部调用本系统的接口指向网关系统。

c.网关系统中添加拦截器或者过滤器对所有请求拦截,根据请求路径去redis中取队列,如果存在,说明被监控了,这个时候就要去判断此接口有没有在10秒内调用的次数达到了阈值。具体算法下面再说。

d.算法处理好后如果达到阈值就写入一条告警信息,然后把请求转发给原目标机。可以用HttpClient或者RestTemplate去实现转发。

e.用户在后台下线告警规则的时候,将该规则所有阈值所对应的队列从redis中移除。

下面说下判断是否在指定时间内超过最大调用数的算法,本算法是康勇敢大师提供的:

LinkedBlockingDeque queue = getQeque(id);
        
        if (queue.size() >= 10) {
            try {
                Long first = queue.takeFirst();
                queue.addLast(System.currentTimeMillis());

                if (10000 > queue.getLast() - first) {
                    throw new Exception("10秒内接口调用次数不能超过三次");
                }
            } catch (InterruptedException e) {
                throw new Exception("10秒内接口调用次数不能超过三次");
            }

        } else {
            queue.addLast(System.currentTimeMillis());
        }

这个算法其实就是定义一个初始容量的桶,每次请求来了,如果桶还没有满,就可以安全的把这个请求扔进去。如果桶满了,那就有可能超过阈值了。这时先把队列第一个元素删掉,把当前的塞到队列的尾端,当前请求就是第阈值次请求,这时候把当前的请求的时间戳减去队列里第一个元素的时间戳,差值如果小于我们定义的并发时间10秒,那说明超过阈值了,需要告警。

以上就是实现接口并发调用次数的可配置化监控、告警方案,具体还没有去做,是个思路,应该还有不完善的地方,欢迎指正!

你可能感兴趣的:(利用网关实现接口并发调用次数的可配置化监控、告警方案)