Skip to content

面试煎熬成蛋_性能优化

参考: https://wx.zsxq.com/dweb2/index/topic_detail/212244125425151

4个常见的性能优化方向: 多线程、JVM、数据库/缓存、数据结构优化

image.png

业务优化:

Excel 导入优化:Excel 大批量导入导出操作优化

1、多线程

异步方式

在 SpringBoot 中使用异步方法优化 Service 逻辑提高接口响应速度?

参考: https://blog.csdn.net/weixin_43441509/article/details/119855613

参考的这篇文章介绍了使用SpringBoot提供的异步方法支持注解的使用;同时介绍了自定义线程池和获取返回值以及捕获异常操作如何进行。

思考:关于异步操作,可以通过多种方式实现,包括使用消息队列(MQ)和利用多线程(如SpringBoot中的 @Async 注解),在技术选型的时候应该如何考虑。

问答:两者在设计理念、使用场景和特性上有所不同;如果是涉及多个服务间的通信,建议使用MQ,而在单个应用内部需要异步处理,使用@Async可能更简单方便;同时MQ在可靠性、解耦、异步通信等方面更有优势。

建议学习项目: https://gitee.com/jd-platform-opensource/asyncTool

(京东零售开源的一个并行框架,里面大量使用到了 CompletableFuture ,可以学习其精华来运用在自己的项目上)


20240324

关于文章 https://blog.csdn.net/weixin_43441509/article/details/119855613 中有讲述到接口优化其响应速度的话,可以使用异步的方式去进行调用一些方法;同时一些用法需要注意一下,异步本质上还是一种代理,因此只能在 Controller 层面上调用 service 方法才有效;

同时一般来说,SpringBoot为我们默认提供了线程池(SimpleAsyncTaskExecutor)来执行我们的异步方法, 我们在项目中一般会自定义自己的线程池。

在注解 @Async("customExecutor") 上可以指定我们注入的 Bean 线程池;

同时如果需要返回结果,可以使用 Future 类及其子类去承接返回结果;

还有一点需要注意的是:强一致性业务不适用异步方法,使用消息中间件可能会更适合

CompletableFuture 原理与实践

参考: https://juejin.cn/post/7168261825165787149#heading-7

建议先看这篇文章,介绍了一下异步任务编排 CompletableFuture 操作

里面通过代码讲述了 同步串行、异步串行、并行任务、多任务结果合并计算以及其他的使用示例。

参考: https://zhuanlan.zhihu.com/p/515993095

该篇文章内容介绍了并行从下游获取数据的业务场景(IO密集型),通过不同方式的使用去优化性能。

优化方式一般是通过同步模型和异步模型;

当采用同步模型的时候,这种方式有时候会效率比较低下,造成的原因一般有:CPU资源浪费在阻塞等待上、回调地狱、线程管理开销等。

其中因为第一点:CPU资源浪费在阻塞等待,在Java8 之前一般会通过回调的方式来减少阻塞,但是大量使用回调,又引发臭名昭著的回调地狱问题,导致代码可读性和可维护性大大降低。

还有另外一种方式是通过 NIO 并行模型从下游获取数据,解决方式一般有两种:

  • 通过RPC NIO异步调用的方式可以降低线程数,从而降低调度(上下文切换)开销
  • 通过引入CompletableFuture 对业务流程进行编排,降低依赖之间的阻塞。

关于 CompletableFuture 的使用:

根据CompletableFuture依赖数量,可以分为以下几类:零依赖、一元依赖、二元依赖和多元依赖。

(等待 N 个 其他任务完成,启动异步任务)

原理与设计思想:to be contined...

附录:略。

高并发

关于在高并发架构场景下,常用的缓存、限流和降级使用,参考: https://mp.weixin.qq.com/s/6hd3ckX-JwPTTZ0bgk1K4A