面试题分析:统计网站访问次数

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 平台的访问量非常高,需要实时统计网站的访问次数,请设计一个计数器解决:初级工程师,可能回答使用synchronized锁或重入锁,进一步探讨,synchronized锁太重,有没其他方式,可能回答atomic类,进一步问,atomic类原理,什么场景下适合用,什么场景下不适合用atomic和synchronized都是单机方案,当一个服务器不能满足性能要求时,线上使用集群,如何在集群场景下实现计数器

难度:较低

  • 平台的访问量非常高,需要实时统计网站的访问次数,请设计一个计数器解决:
  • 初级工程师,可能回答使用synchronized锁或重入锁,进一步探讨,synchronized锁太重,有没其他方式,可能回答atomic类,进一步问,atomic类原理,什么场景下适合用,什么场景下不适合用
  • atomic和synchronized都是单机方案,当一个服务器不能满足性能要求时,线上使用集群,如何在集群场景下实现计数器
  • 可能回答在DB中计数,则问,如何避免更新丢失,即A和B两个线程同时读取当前计数,加1后更新DB,出现更新丢失
  • 可能回答使用redis原子操作incr,则问当访问量极大,不能满足性能需求,如何做sharding,考虑一致性hash
  • 面试者,不仅是回答问题,还可以探讨,所谓的实时统计,要求的精度是多高,如果有延迟10-20秒的误差,是否可接受,若可接受,还有其他哪些方案能达到高性能和高可用

方案分析

网站访问量统计功能大多是分布式集群情况下,才需要进行统计,如果当前系统只有一台机器,通过AOP做核心接口的切面拦截就可以实现,考虑的难点也很少。

在集群模式下,使用redis存储统计数据是可行的,但随之而来的成本问题和性能问题就需要考虑。

  1. 成本问题:当一个网站访问量较大时,如QPS达到1w/s时,每次请求都需要调用redis进行计数累加。这里无疑会加重redis负担,单机redis无法保证和支持需求,从而又需要引入集群版redis来保证服务可靠性、可用性,这又增加系统复杂度,增加开发成本运维成本。

  1. 性能问题:每次接口请求都调用redis的话,相当于接口整体耗时都要增加,虽然redis一次请求也就5ms左右,但对于整体接口提高一定耗时来增加一个不算是关键功能的业务,并不太划算,还是有很大的优化空间。

  1. 一致性问题:综合上面两个问题,势必需要采用集群版redis,而接口统计也不能每次都进行累积,可以通过异步或定时/定量的方式进行统计,例如优先完成接口处理,然后再通过异步线程池的方式统计,异步的时候也并不一定每次都统计,可以间隔2s,5s进行数据统计,或者达到100次,500次这样的阈值再统计,这样能提升接口性能,减轻redis集群压力,但也有了新的问题,数据不一致了,或者说这一秒的统计量并不是真正的访问量。

Redis方案:

拆分统计key,数十台服务器同时访问更新一个redis-key不如根据不同服务器地址特征来进行拆分,每台服务器修改自己对应的key,在汇总统计功能里,遍历所有的key列表来累加所有访问量,也可以得到实时的访问统计。

上面的方案还是存在对redis大量请求的问题,可以创建一个异步线程池用来请求redis进行数据上报,每台服务器的接口使用变量来记录接口访问量,当达到100次时创建一个统计任务,提交到线程池中进行处理,阈值越大对接口的性能影响越小,同样的数据不一致性越高。

nginx方案

正常网站请求都会通过nginx作为前端请求入口,nginx会记录每次访问日志,可以通过在每台服务器上挂日志脚本的形式来分析日志数据,或者直接监控日志文件变更内容,也可以实时的上报统计数据,并且不侵入现有服务,对当前服务接口没有影响。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5天前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
14 2
|
12天前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
21 3
|
5天前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
13 0
|
5天前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
14 0
|
5天前
|
Java
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
8 0
|
1月前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
23 0
|
1月前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
37 0
|
2月前
|
安全 测试技术
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
|
2月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_55 销售分析 I
「SQL面试题库」 No_55 销售分析 I
|
2月前
|
存储 安全 网络协议
面试必备基本知识HTTPS 原理分析
面试必备基本知识HTTPS 原理分析