互联网大厂面试题解析之大疆一面

2024-03-02 09:16:59 浏览数 (2)

统计接口请求数量,以及接口耗时如何去做。

方案

首先在 Java 中统计接口请求数量,可以通过以下设计方案之一实现:

  1. 使用计数器变量:在代码中维护一个计数器变量,每当接口被调用时,增加计数器的值。这种方法简单直接,适用于单线程环境。
代码语言:javascript复制
public class RequestCounter {
    private int requestCount = 0;

    public void incrementRequestCount() {
        requestCount  ;
    }

    public int getRequestCount() {
        return requestCount;
    }
}
  1. 使用并发安全的计数器:如果在多线程环境下进行统计,可以使用 Java 中的原子变量或者使用并发集合类来保证线程安全。
代码语言:javascript复制
import java.util.concurrent.atomic.AtomicInteger;

public class ConcurrentRequestCounter {
    private AtomicInteger requestCount = new AtomicInteger(0);

    public void incrementRequestCount() {
        requestCount.incrementAndGet();
    }

    public int getRequestCount() {
        return requestCount.get();
    }
}
  1. 使用拦截器或过滤器:在 Web 应用中,可以使用拦截器或过滤器来统计接口请求数量。每当请求进入时,拦截器或过滤器会进行统计操作。
  2. 使用 AOP(面向切面编程):通过 AOP 可以在方法执行前后插入统计逻辑,实现统计接口请求数量的功能,这种方法适用于更复杂的应用场景。
  3. 当然也可以借助其它中间件来去看,比如:SpringBoot - Actuator、Prometheus、Zabbix、Garafana等等。具体看实际的业务场景。

SpringBoot - Actuator应用监控使用详解3(metrics端点:度量指标信息展示)

  • https://www.hangge.com/blog/cache/detail_2723.html

以上是几种常见的设计方案,具体根据业务场景去选择。当然实际业务场景中也可借助一些系统已经使用的中间件,比如Redis

需求分析

当需要统计每个接口的访问量的话,首先,设计接口访问统计表是一个常规的任务,表的设计应包含一些常见字段。例如,统计类型可以按小时、天或月进行统计;接口访问名称和URL也是必要字段。另外,可以增加一个统计时间字段,其格式可以根据需求而定。对于时间段统计,可以设计开始时间和结束时间;而对于具体统计时间,可以从上次统计时间到当前时间进行统计。最后,接口访问量是另一个重要字段。设计非常灵活,没有固定的模式,可以根据项目的实际需求进行调整。

实际思路方案
  • 首先,需要一个地方来存储所有需要统计的接口信息,主要包括URL和接口说明。由于接口请求的URL通常是固定的且不会频繁更改,对于少量数据,可以考虑使用枚举值进行存储或者将这些信息配置在独立的配置文件中,并在项目中加载。对于大量接口数据,如数百甚至上千条数据,枚举值可能不太适用,可以考虑创建数据表来存储接口数据。
  • 其次,需要实现存储每次调用接口时的访问信息。对于访问量较大且需要快速响应的接口,一个简单实用的方法是将访问信息存储在缓存中,先将数据保存,然后再进行其他处理。每次访问接口时,增加该接口的访问量计数。
  • 最后我们可以使用Redis进行统计操作非常方便,可以直接对Redis中存储的某个值进行加一操作。这一步操作可以通过拦截器结合异步方式来对被访问接口进行自增操作,从而加快接口的访问效率。

完成前面的步骤后,最后一步涉及如何进行统计。通常的做法是启动一个定时任务,比如每半小时或每小时执行一次,统计接口的访问量,然后将统计数据永久存储到数据库中。这种方式可以避免在Redis服务异常时数据丢失的风险。具体的统计逻辑可以如下:

  • 定时任务触发统计操作。
  • 从Redis中获取各个接口的访问量数据。
  • 将这些数据汇总,并写入数据库进行永久存储。
  • 可以考虑保留历史统计数据,以便进行趋势分析或性能优化。

这样的设计思路可以帮助您实现接口访问统计功能,并根据项目的需求灵活调整和扩展。

0 人点赞