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

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

方案

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

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

    public void incrementRequestCount() {
        requestCount++;
    }

    public int getRequestCount() {
        return requestCount;
    }
}
  1. 使用并发安全的计数器:如果在多线程环境下进行统计,可以使用 Java 中的原子变量或者使用并发集合类来保证线程安全。
java 复制代码
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端点:度量指标信息展示)

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

需求分析

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

实际思路方案

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

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

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

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

SQL优化实际是怎么操作的

这个问题可参考。

如果线上遇到OOM如何解决,关于这个问题也可参考之前的文章

MySQL系列文章

JVM系列文章


如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。

免费的Chat GPT可关注公众号【AI贝塔】进行体现,无限使用。早用早享受

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

相关推荐
IT_陈寒12 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码13 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo13 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志14 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..14 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects14 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰14 小时前
一些基础和问题解决
后端
陈随易14 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN15 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp
Imchendiana15 小时前
《狂人日记NO.9》— 前后端一把梭,我的全栈实录
前端·后端