本文介绍了列表中每个ID的多个RestTemplate调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要为List<Ids>
中的每个Id
调用多个RestTemplate
。执行此操作的最佳方式是什么?我已使用parallelStream()
。下面的代码片段是一个类似的方案。
List<Integers> employeeIds;
employeeIds.parallelStream().
.map(empId -> employeeService.fetchEmployeedetails(empId))
.collect(Collectos.toList());
employeeService.fetchEmployeedetails
是一种将获取所有employeeDetails
的restCall
。
是否有其他方法调整性能?
推荐答案
.parallelStream()
不保证多线程,因为它只会创建与您拥有的核数相等的线程。要真正强制多个线程同时执行此操作,需要将.parallelStream()与ForkJoinPool
一起使用。
使用ForkJoinPool实现高性能
List<Employee> employees = new ArrayList();
ForkJoinPool forkJoinPool = new ForkJoinPool(50);
try {
forkJoinPool.submit(() -> employeeIds.parallelStream().forEach(empId -> {
Employee em = employeeService.fetchEmployeedetails(empId);
synchronized(employees) {
employees.add(em);
}
})).get();
} catch (Exception e) {
e.printStackTrace();
throw new BusinessRuleException(ErrorCodeEnum.E002501.value(), e.getMessage());
} finally {
if (forkJoinPool != null) {
forkJoinPool.shutdown(); // always remember to shutdown the pool
}
}
这将确保parallelStream()创建最多50个线程,而不是取决于系统的核心数量。确保你没有忘记在最后的挡路中shutdown()
池子。并且不要忘记.get();
是哪个触发了线程的执行。
通过此方法,您将看到极大的性能提升。
如何选择最佳线程数
过多的线程会导致上下文切换并减慢进程。线程太少会导致系统未得到充分利用。最佳线程数量通常是您拥有的核心数量的10倍左右。还取决于您将在线程中花费的时间。我通常会传递一个环境变量,这样我就可以在需要的时候调优数字50。但在我们拥有的一个四核实例上做了相当多的实验之后,我已经到了50岁了。
@Value("#{systemEnvironment['parallelism'] ?: 50}")
protected int parallelism;
然后使用ForkJoinPool forkJoinPool = new ForkJoinPool(getParallelism());
这篇关于列表中每个ID的多个RestTemplate调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!