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

news2024/10/7 20:35:43

难度:较低

  • 平台的访问量非常高,需要实时统计网站的访问次数,请设计一个计数器解决:
  • 初级工程师,可能回答使用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会记录每次访问日志,可以通过在每台服务器上挂日志脚本的形式来分析日志数据,或者直接监控日志文件变更内容,也可以实时的上报统计数据,并且不侵入现有服务,对当前服务接口没有影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redisson中Semaphore的信号量介绍及其原理

目录 1 基本介绍 1.1API介绍 1.2 示例 2 源码解析 2.1 Semaphore设置许可数量(trySetPermits(int permits)) 2.2 尝试获取许可(boolean tryAcquire()) 3 Lua脚本 3.1 加锁lua脚本 3.2 解锁lua脚本 1 基本介绍 Semaphore通…

科技资讯|苹果Vision Pro新专利曝光,与消除晕动症的技术有关

欧洲专利局发布了一份苹果专利,与消除 Apple Vision Pro 晕动病背后的一些工作有关。苹果通过推出新的 R1 处理器实现了这一目标,苹果专利提供了处理器背后的一些详细技术信息,在第 86 号专利点指出:" 在某些实施方案中&…

驾驭计算机视觉的翅膀:论文找代码的几种必杀技!

摘要 对于CVer来说,「代码和找代码」能力都是一种很重要的能力,毕竟idea再好只有通过代码实现出来才能发文章和刷榜。当我们阅读一篇高质量或者英文论文时,如何去找到该文章实现的代码,进而结合文章内容和代码实现去更好的理解作…

PoseiSwap 更新第二期空投,持有 Zepoch 节点数量将决定空投回报

Nautilus Chain 是行业内首个模块化 Layer3 架构链,开发者能够基于模块化进行定制化开发,并有望进一步推动 Web3 应用向隐私、合规等方向发展。当然,Nautilus Chain 的特殊之处还在于为生态用户带来丰厚的空投预期,据悉上线 Nauti…

基于matlab使用标记增强技术将虚拟内容呈现到现实场景中(附源码)

一、前言 此示例演示如何使用基于标记的增强现实将虚拟内容呈现到场景中。 增强现实 (AR) 通过自然混合真实和虚拟内容来增强现实世界的场景,从而创建新颖的应用程序。例如,增强现实应用程序可以添加虚拟标尺,使用户…

如何正确使用 ThreadLocal

1 前言 当多线程访问共享且可变的数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要ThreadLocal出场了。 ThreadLocal又称线程本地变量,使用其能够将数据封闭在各自的线程中,每…

数据管理成熟度评估DCMM之生产企业数据战略管理办法

生产企业数据战略管理办法 第一部分:导言 随着信息技术的快速发展和数据规模的急剧增长,生产企业越来越重视数据的价值和管理。有效的数据战略管理办法可以帮助生产企业更好地管理和利用数据资源,提高运营效率、决策质量和创新能力。本文将…

SpringMVC数据传递总结

文章目录 1. 分析总结2. 普通格式数据2.1 普通参数2.2 pojo参数2.3 嵌套pojo参数2.4 数组 -- 普通参数2.5 集合 -- 普通参数2.6 web容器添加过滤器指定字符集 3. JSON格式数据3.1 相关准备3.2 json数组(基本)3.3 json对象(pojo)3.4 json数组(pojo) 1. 分析总结 1.1 普通格式数据…

K8S平台安全框架

平台安全框架 1 平台安全框架1.1 安全框架1.1.1 认证框架1.1.2 框架解读 1.2 认证实践1.2.1 令牌用户1.2.2 证书用户 1.3 授权实践1.3.1 集群用户1.3.2 角色基础1.3.3 授权基础1.3.4 用户组实践1.3.5 SA授权1.3.6 SA秘钥 1.4 准入实践1.4.1 准入基础1.4.2 优先调度1.4.3 资源配…

F2-NeRF阅读日志

看到了一篇很好的paper,记录一下,参考: https://www.bilibili.com/video/BV1Lz4y187jL/?spm_id_from333.337.search-card.all.click&vd_sourcea059a118f33728f79abd79e02f8f72d4 https://zhuanlan.zhihu.com/p/618362291 latex写的&am…

Qt5编译使用QFtp模块(环境:win+Qt5.15.2+msvc2019)

目录 QFtp下载编译配置QFtp模块测试 QFtp下载 下载方式较多,可以从github上进行下载:https://github.com/qt/qtftp.git 。 我已将下载好的ftp源码资源放出来了,可以直接下载0积分:链接跳转。 编译 使用Qt Create打开工程后&…

DuDuTalk:4G录音工牌在汽车试乘试驾场景中有什么独特应用价值?

在市场竞争越来越激烈的今天,不管是新能源市场还是燃油车市场,试乘试驾已经当仁不让地成为了几乎所有汽车品牌关注的焦点。特斯拉、“蔚小理”、奔驰、宝马等头部品牌,对于试乘试驾的重视度一定程度上甚至已经超过了展厅接待。 然而&#xf…

解决notion共享网址无法复制的问题

1、打开url Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 2、选中要复制的内容。 3、右击鼠标,选择“打印” 4、在打印界面中选中要复制的内容,然后按“复制” 复制完成。

Stable Difussion能做什么?

​扩散模型(Diffusion Model)​ 稳定扩散模型(Stable Diffusion)属于深度学习模型中的一个大类,即扩散模型。它们属于生成式模型,这意味着它们是被设计用于根据学习内容来生成相似的新的数据的。对于稳定扩…

Vue2与Vue3相应原理区别

Vue3.0中的响应式原理 vue2.x的响应式 1.实现原理: 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法…

测试老鸟整理,性能测试高并发压力测试-案例,进阶之道...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 单个接口的压测&a…

通过foxmail同步其他邮箱邮件到我司邮箱

1、先通过foxmail 登录需要备份邮件的邮箱帐号,全选需要备份的邮件,右键选择“导出邮件”。 2、在foxmail中使用IMAP协议登录我司邮箱帐号,右键选择收件箱或其他文件夹导入邮件,将之前导出备份的邮件文件全选导入。 3、导入完成后…

glibc缺陷居然会导致MySQL卡住?

问题来源: 版本:5.7.25。 现象:备机主从延迟不断变大,无法登陆数据库,建立连接时卡住,但很快恢复正常了。 分析: 常规分析: 通常情况下,这类问题无法分析&#xff0c…

vmware17安装openkylin

官网 系统下载-openKylin 开放麒麟社区官网 | 开源聚力,共创未来 下载链接 https://www.openkylin.top/downloads/download-smp.php?id18 安装 点击浏览,选择镜像 修改服务器cpu配置 修改内存配置 修改网络连接方式 点击启动 等待安装完成 出现上图说…

比较两个Excel表格中的数据,不相同的高亮显示

下面是常用的在Excel中比较两个Excel表格数据的方法, 比如要比较下面A和B中的数据是否一致: 可以这样做: