【Java核心能力】高并发在简历上如何体现?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

高并发在简历上如何体现?

image-20240311101521033

个人觉得并发相关的内容是最基础的,同时也是最重要的能力,在面试中并发相关的内容也是比较热点的,在项目中的优化也离不开并发!
image-20240311103317751

接下来说一下如何通过并发来优化自己的项目!

在面试中所谓的项目亮点要么是 业务亮点 ,要么是 技术亮点

  • 业务亮点

业务亮点 也就是设计模式、业务、可用性的体现,而作为应届生来说,一般也写不了很多业务代码,这方面的积累不会太好,所以应届生的简历优化、项目优化更加侧重于 技术亮点

  • 技术亮点 如何体现呢?

体现在对项目优化上,那么项目要如何优化呢?

可以从两个角度来考虑,一个是 高可用 方面的优化,另一个是 高并发 方面的优化

这里主要说一下高并发,要优化项目,首先要想当项目的访问量上来之后,我们应该如何去提升项目的 QPS 以及接口响应时间!

项目在高并发上的优化

秒杀操作的优化

未优化版本

以电商中的 秒杀操作 来说,需要加锁来保证秒杀操作的并发安全,如果没有什么并发量,用户量很小,那么我们可以使用最简单的方式实现:

  • 如果秒杀模块是单节点部署,那么就使用 synchronized 将整个秒杀流程给锁住就好了
  • 如果秒杀模块是多节点部署,那么就使用 Redis 分布式锁 或者 ZK 分布式锁 将整个秒杀流程给锁住就好了

这样做的话,好处就是实现起来比较方便,但是由于我们锁的粒度是比较大的,将整个秒杀流程都给锁住,并且秒杀中肯定会有许多耗时操作,比如扣减库存、生成订单等等,这些都是网络 IO 操作以及对共享资源的并发操作,这样耗时操作全部串行执行,会导致整个秒杀流程耗时较长

异步优化
  • 那么我们就可以考虑通过异步化的方式对秒杀操作进行优化!

在高并发系统中,要进行性能优化,无非是从 3 个方面:分流缓存异步

异步化 的好处就是可以让比较耗时的操作脱离主流程,这样主流程在发起这些比较耗时的操作之后,可以去接着做其他的事情

那么我们就可以使用队列来对秒杀操作进行异步化,当用户发起秒杀请求时,将秒杀请求放入队列中,消费者监听到消息之后,根据自己的能力去队列中取出请求进行秒杀的处理,这样就可以避免大量的下单请求从而导致应用负荷较高

image-20240229202804169

  • 因此经过队列优化后,整个秒杀的下单流程为:

1、用户提交订单请求,请求进入到队列中,并返回用户一个排队编号

2、用户提交订单后,进入到等待界面中,显示用户前边还有多少请求等待处理,预计多长时间处理完毕

3、当用户的订单被下单系统成功处理之后,将用户界面跳转到支付页面,提示用户进行支付,之后就完成这笔订单

  • 那么既然使用队列来优化性能,选择哪一个队列组件来实现呢?

我们常用的消息队列有 RocketMQ、Kafka 等等,这里并没有选用这些消息队列,而是 使用了 Redis 来实现队列

相比于 RocketMQ 这些,Redis 更加轻量,并且基于内存操作,性能更好,使用 Redis 自带的队列数据结构,可以获取 队列长度 以及 请求在队列中的位置 ,可以及时反馈给用户排队进度

上边说了通过异步化的方式将秒杀流程给脱离出去,这样就可以保证比较好的性能

分段锁优化

那么还可不可以进一步优化呢?

可以的,上边虽然通过队列将秒杀流程异步化,但是最终主干流程还是需要取到这个异步化的结果的,那么可以针对秒杀流程中对共享资源的加锁进行优化,也就是 对分布式锁进行优化

这里假设使用了 Redis 分布式锁,针对分布式锁的优化其实比较简单,就是 降低锁粒度!

秒杀中肯定要扣减库存,秒杀模块多节点部署的话,多个节点同时操作库存是不安全的,因此肯定要使用分布式锁,原先我们使用分布式锁将整个库存给锁起来,比如果有 10000 件库存的话,每个节点来操作时,都会竞争这一把锁

降低锁粒度之后,也就是使用 分段锁 ,可以将 10000 个库存分为 100 份进行存储,即 inventory_01 = 100、inventory_02 = 100、...、inventory_100 = 100 ,每一份分配一把锁,那么原来所有的节点都是去竞争 1 把分布式锁,现在是竞争 100 把分布式锁,性能提升了 100 倍!

image-20240310210718551

高并发写以及补偿优化

上边说了通过分段锁优化,其实还可以再进一步优化

在秒杀中,是需要针对库存进行 高并发的写操作 的,那么针对于高并发的写操作有这么一个优化流程:直接对 Redis 缓存进行写操作,再通过 RocketMQ 异步进行落库 ,也就是 将 Redis 作为主存储,将 DB 作为辅助存储

那么这样的话,可以大幅度提升高并发写的性能!

这里如果为了保证库存更新的可靠性的话,可以考虑在 DB 中先存储订单状态,当 RocketMQ 异步处理之后,将订单状态修改为已完成,如果存在未完成的订单状态,就 通过定时任务扫描进行补偿

image-20240310210859369

其他方面的简历优化操作

异步优化

针对异步的优化,可能有些操作任务比较简单,并不需要使用很重的 RocketMQ 进行异步化,那么就可以使用简单的 CompletableFuture 进行异步化,并且京东还开源了 asyncTool 并行框架 ,提供了比 CompletableFuture 更加丰富的任务编排功能!

网络 IO 优化

还有一些网络 IO 的操作,可以将耗时的操作丢到线程池中去,通过 线程池 进行来提升耗时 IO 操作的性能

如果是传输类的优化,可以考虑 压缩传输数据的大小 或者 自定义网络传输协议 ,这样在网络中传输的数据量就小了,以此来提升网络传输的性能

数据库优化

数据库方面的优化,如果表数据量可能会达到几百万甚至上千万(用户表、订单表),可以考虑 提前进行分库分表

当业务基本稳定之后,可以根据业务去数据库中 建立索引 ,优化数据库查询性能

慢查询 问题的监控、排查,以及解决

集群部署优化

对于有些可能承载比较多请求的模块,可以考虑 多节点部署 ,针对这些节点进行负载均衡,来分散请求压力

缓存优化

读多写少 的场景使用 Redis 缓存数据,优化查询效率

写多读少 的场景可以使用 Redis 作为主存储 ,针对 Redis 执行写操作,通过 MQ 异步落库

Redis 中的热点数据存储在 JVM 缓存中,使用 二级缓存(Redis+JVM缓存) ,JVM 缓存可以使用 Guava Cache 或者 Caffeine 实现

数据一致性优化

既然用到了缓存,肯定是要保证缓存数据与数据库的一致性,这里说一下常用的 数据一致性保证策略

  • AOP + 延时双删 :通过 AOP + 延时双删来保证 Redis 和 MySQL 的数据一致性
  • Canal + MQ :通过 Canal + MQ 来同步数据库中的增量数据,来保证数据库和缓存的一致性
MQ 优化

使用 MQ 的话,主要是针对于三个方面优化: 解耦异步化

解耦 可以让系统的可扩展性更强,并且比较容易维护,比如用户取消订单的操作,在用户创建完订单之后,如果取消订单,在不使用 MQ 的情况下,需要在取消订单的逻辑中去一个一个执行取消订单后需要执行的操作,如下:

  • 库存系统释放库存
  • 返还用户积分
  • 释放用户使用的优惠券

这样会导致取消订单的动作和其他业务耦合度很高,如果使用 MQ 之后,只需要在这三个地方关注订单取消的事件,不需要将取消订单中做很多耦合的操作

如果后续需要对取消订单做出调整,只用在订阅【取消订单】事件的位置修改代码即可

异步化 可以降低耗时操作对系统的影响,并且可以将一瞬间的大量请求给铺开来,也就是 削峰填谷

在用户推送消息的场景中,可能需要向大量用户推送数据,那么系统就需要向 MQ 推送大量数据,那么就可以引入 多线程 优化,如果数据量太大的话,可以考虑 将数据进行分片 ,提升推送的速度,如下图,将 1000w 用户分片为 10000 条,并使用多线程推送:

多线程、分片推送MQ

部署方面的优化

部署方面的话,就是机器如何部署,以及对机器性能的了解,这些属于生产经验

在项目上线部署之后,可以对项目部署一套监控环境(Prometheus + Grafana),再对项目进行压测,观察项目的:

  • QPS: 每秒执行的请求数
  • TPS: 每秒执行的事务数
  • RT: 接口的响应时间(T99、T95)
  • 机器的负荷指标 (CPU、IO、内存、带宽负荷):CPU 负荷可以使用 top 命令查看 Load Average 指标

这样可以了解项目在生产环境部署时可以承载的最大请求数量,心里对系统的性能有个大致的了解!

这里说一下常用的机器部署经验:

对于网关、注册中心、数据库这种属于是 基础架构类型的系统 ,一般来说机器的配置要高一些(4C8G、8C16G 以上)

一般网关、注册中心都是集群部署,网关一般部署 2-3 台,注册中心如果使用 ZK 的话,部署 1 主 2 从

数据库部署的话,4C8G 的机器部署 MySQL 一般每秒可以应对几百个请求;8C16G 可以应对几百上千的请求;16C32G 可以应对小几千请求

那么如果访问量突然扩大 10 倍该如何应对?

对于网关、服务这些实例对象来说,可以通过添加节点,再通过 Nginx 负载均衡到不同节点,来应对突增的请求

这其实就是 横向扩容 ,网关作为应用的入口,如果支持横向扩容的话,就可以动态扩容或者缩容来应对大量的请求

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣大厂热门面试算法题 12-14

12. 整数转罗马数字,13. 罗马数字转整数,14. 最长公共前缀,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.11 可通过leetcode所有测试用例。 目录 12. 整数转罗马数字 解题思路 完整代码 Java Pytho…

​LeetCode解法汇总1261. 在受污染的二叉树中查找元素

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:. - 力扣(LeetCode) 描述: 给出一个满足下述规则的二叉树&#xff1…

基于SpringBoot的“医院信管系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“医院信管系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 功能结构图 系统首页界面图 用户注册界面图 医生…

基于Android的教学课程系统设计与开发

摘 要 移动应用已经成为人们生活必不可缺的一部分,大学生身为移动应用的最大用户群体,在生活学习娱乐各个方面都与移动应用有着紧密联系,然而针对大学生校园学习的移动应用却寥寥无几,因为不同的学校,甚至不同的院系&…

java guide 八股

Java语言特点 简单易学、面向对象(继承、封装、多态)、平台无关性(Java虚拟机jvm)、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存 JVM:Java虚拟机(跨平台的关键) JRE&#xff…

【maven下载、安装、配置教程】

一、下载 maven 官网:Maven – Download Apache Maven 注意:idea 和 maven 的版本问题,不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本,用 3.9版本的 maven 会报错。 二、配置maven全局配置…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日,第八届瑞芯微开发者大会(RKDC2024)在福州成功举办,大会以“AI芯片AI应用AloT”为主题,通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联,吸引数千名开发者、合作伙伴以及行业专…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip,zcat/zmore/zless/zgrepbzip2,bzcat/bzmore/bzless/bzgreppxz,xzcat/xzmore/xzless/xzgrepgzip,bzip2,xz压缩时间对比打包命令:tar打包命令…

Java基础-接口

文章目录 1.快速入门代码:结果: 2.接口基本介绍1.语法注意:在jdk1.8以后接口才可以有静态方法,默认方法 2.代码实例 3.接口的应用场景1.场景介绍2.代码实例4.接口使用细节 5.接口课堂练习题目:答案:注意&am…

【快速上手QT】08-Buttons组件

我们差不多把QT的基础部分讲差不多了。接下来我们把一些组件介绍一下,最后再开始QT的进阶部分,需要先把基础打牢嘛,也当是练习练习怎么使用QT助手了。 就按照QtDesigner里的顺序,今天我们讲一讲Buttons,也就是按钮组件…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息,如 ls --help,help ls,man ls,info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时,可以使用快捷键进行操作

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

深入浅出Java泛型

公众号「稀有猿诉」 原文链接 深入浅出Java泛型 温故而知新&#xff0c;可以为师矣&#xff01; 在前面的一篇文章中学习了Kotlin的泛型知识&#xff0c;但总感觉还不够深入&#xff0c;因为一些深入的话题和高级的特性并未有讲清楚。但在继续深入之前还是有必要重温一下…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09; 第一门课&#xff1a;神经网络和深度学习 (Neural Networks an…

04-微服务 面试题

目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…

scrapy的基本使用介绍

创建项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架 scrapy startproject my_spider### 4. 生成项目 scrapy genspider baidu https://www.b…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接&#xff1a;https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码&#xff1a;v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…

15. UE5 RPG获取GE应用的回调,并根据Tag设置数据显示到窗口

在上一篇介绍了对标签如何在项目中设置&#xff0c;这一篇先讲解一下如何在GE里面使用GameplayTag标签。 之前我在第十一章节中 11. UE5 RPG使用GameplayEffect修改角色属性&#xff08;二&#xff09;介绍了一些GE的属性&#xff0c;在UE 5.3版本中&#xff0c;修改的配置方式…