优化耗时业务:异步线程在微服务中的应用

2024-05-29 04:44

本文主要是介绍优化耗时业务:异步线程在微服务中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是程序员大猩猩。

大家都知道,在我们实际开发过程中,我们经常会遇到一些耗时的业务和逻辑,比如说要上传什么大文件,又或者是大文件的数据处理。我们不能一个接口上等着这些耗时任务完成之后了,再返回,那用户体验度会大打折扣的。

这时候,我们最基本的操作就是使用多线程处理或者是异步线程处理。这里我们说一下异步线程处理。

那么我们来说一下,微服务中如何使用异步线程呢?

一、使用 @Async 注解我们来看看它的源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {/*** A qualifier value for the specified asynchronous operation(s).* <p>May be used to determine the target executor to be used when executing* the asynchronous operation(s), matching the qualifier value (or the bean* name) of a specific {@link java.util.concurrent.Executor Executor} or* {@link org.springframework.core.task.TaskExecutor TaskExecutor}* bean definition.* <p>When specified on a class-level {@code @Async} annotation, indicates that the* given executor should be used for all methods within the class. Method-level use* of {@code Async#value} always overrides any value set at the class level.* @since 3.1.2*/String value() default "";
}

我们看到Async内,只有一个参数value,这个value的设置来确定异步线程指定线程池的名字。

当然这里我们可以不设置这个value,可以使用默认的。但是为什么要设置这个value,来指定线程池呢?因为指定线程是为了控制和管理异步任务。

a. 如果不指定线程池,Spring 默认使用 SimpleAsyncTaskExecutor,这不是一个真正的线程池,因为它为每个任务创建一个新的线程。这可能导致线程数量的快速增长,从而消耗大量系统资源。通过指定一个真正的线程池,如 ThreadPoolTaskExecutor,可以复用线程,减少资源消耗。b. 线程池可以提供更好的性能,因为它可以减少线程创建和销毁的开销。线程池中的线程可以被重复使用,而不是每次执行异步任务时都创建新的线程。

c. 通过为不同的服务或组件指定不同的线程池,可以实现线程隔离。这意味着如果一个服务出现异常或者需要大量时间来处理任务,它不会影响到其他服务的性能。d. 线程池提供了任务调度和管理的能力,比如设置核心线程数、最大线程数、队列容量等,这样可以更精细地控制任务的执行行为。e. 线程池通常提供了任务执行错误的处理机制,比如当任务执行失败时的重试策略。f. 线程池可以提供线程的运行状态和性能指标,这对于监控和调试应用程序是非常有用的。怎么设置线程池?

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
public class ThreadPoolConfig {@Bean(name = "taskExecutor")public ThreadPoolTaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2); // 核心线程数executor.setMaxPoolSize(5); // 最大线程数executor.setQueueCapacity(10); // 队列容量executor.setThreadNamePrefix("Async-"); // 线程名称前缀executor.initialize();return executor;}
}

设置好线程池后,我们就可以在方法上使用@Async,开启异步线程了。

@Async("taskExecutor")
public void executeAsyncTask() {// 异步任务逻辑
}

最后要记住:在微服启动类之上,加入注释@EnableAsync就可以了。

@SpringBootApplication
@EnableAsync
public class AsyncApplication {public static void main(String[] args) {SpringApplication.run(AsyncApplication.class, args);}
}

二、使用 CompletableFuture

CompletableFuture 是 Java 8 引入的一个类,用于表示异步计算的结果。通过 CompletableFuture,我们可以很方便地实现异步操作,并且可以链式调用多个异步任务。

@Service
public class CompletableFutureService {public CompletableFuture<String> executeAsyncTask() {return CompletableFuture.supplyAsync(() -> {System.out.println("执行异步任务:" + Thread.currentThread().getName());return "异步任务执行结果";});}
}@RestController
public class CompletableFutureController {@Autowiredprivate CompletableFutureService completableFutureService;@GetMapping("/completableFuture")public CompletableFuture<String> completableFuture() {return completableFutureService.executeAsyncTask();}
}三、组合使用 @Async 和 Future

我们可以通过 @Async 返回一个 Future 对象,以便在需要时获取异步任务的执行结果。

@Service
public class FutureService {@Asyncpublic Future<String> executeAsyncTask() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行异步任务:" + Thread.currentThread().getName());return new AsyncResult<>("异步任务执行结果");}
}@RestController
public class FutureController {@Autowiredprivate FutureService futureService;@GetMapping("/future")public String future() throws ExecutionException, InterruptedException {Future<String> future = futureService.executeAsyncTask();return "异步任务执行结果:" + future.get();}
}

本文介绍了在SpringBoot中使用异步线程的三种方式:使用@Async注解、CompletableFuture和@Async结合Future。在实际开发中,我们可以根据具体需求选择合适的异步实现方式,提高应用程序的性能和用户体验。

这篇关于优化耗时业务:异步线程在微服务中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012679

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在