REST调用减慢Spring启动应用程序 - 性能改进
问题描述:
我们有一个应用程序,我们解析excel(大约100k),并在excel中的每一行我们将调用4个不同的REST调用[在不同的域]和返回的输出存储在REDIS实例中用于进一步处理REST调用减慢Spring启动应用程序 - 性能改进
1)如果有100k条记录,我们将使用100k * 4个并行REST API调用(并行50个线程),并且一条记录需要30秒来完成整个过程。这似乎减慢了我们的流程,因此我们可以使用其他可选框架(在Java相关技术中会有所帮助)来加速此过程。 2)由于REDIS是单线程,因此我们要按顺序插入数据,因此在这个过程中需要更多时间,是否有一种方法可以将并行数据从REDIS中取出或者有其他选择。
答
这真的很有趣的事情,只是在我脑海中弹出一个解决方案就是这样。
- 使用队列(例如Apache的ActiveQ)
- 过程excel文件,并把单独的消息队列
- 收件向上其他服务(一个或多个),用于处理从该队列中的消息。
通过这样做,你的主要服务将是放心,这将只是读取Excel文件,并把消息队列,可以用头把队列前辨别信息,这将帮助,如果您正打算写不同的服务针对它们将从队列中消耗的不同类型的消息。
答
您可以使用@Async
(https://spring.io/guides/gs/async-method/),或者您可以使用执行程序同时执行多个进程。下面是我如何与执行者做的:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
List<FutureTask<Integer>> workersList = new ArrayList<FutureTask<Integer>>();
然后提交您的新主题执行人:
for (int i = 0; i < nRecords; i++) {
Worker worker = new Worker(args);
workersList.add(worker);
}
pool.shutdown(); // Disable new tasks from being submitted
while (!executor.isTerminated()) {
}
for (int i = 0; i < nRecords; i++) {
System.out.println(workersList.get(i).get());
}
你的工作线程应该实现可调用:
public class Worker implements Callable<Integer> (String[] args)