我正在创建一个端点,该端点检索我一些数据,并且在此调用中它调用了3个不同的REST调用,因此,这会影响应用程序的性能。
@Autowired
private PlatformTransactionManager transactionManager;
// in your test funciton
// Declare a transaction programmatically to be able to rollback.
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);
try {
// here test of Dao goes
} finally {
transactionManager.rollback(transaction);
}
因此,这种复杂性会影响性能。
我尝试添加多线程概念,但是普通代码和多线程所花费的时间几乎相同。
条件就像,我们不能修改3个外部REST调用来支持分页。
由于没有数据库,因此无法添加分页。 有什么解决办法吗?
答案 0 :(得分:0)
您不应该添加线程,而应该完全删除线程。即您应该使所有代码都无阻塞。这只是意味着所有工作基本上都将在http客户端的线程池中完成,而所有等待都可以在操作系统的选择器中完成(我们想要的)。
这里有一些代码,假设您的http调用返回CompletableFuture
,那么此核心逻辑将如何工作。
public CompletableFuture<List<Something>> retrieveSomethings() {
return retrieveUserApps().thenCompose(this::retriveAllAppsSomethings);
}
public CompletableFuture<List<Something>> retrieveAllAppsSomethings(List<UserApp> apps) {
return CompletableFuture.allOf(
apps.stream().map(this::retriveAppSomethings).toArray(CompletableFuture[]::new))
.apply(listOfLists -> listOfLists.stream().flatMap(List::stream).collect(Collectors.toList()))
.apply(this::filterSomethings);
}
public CompletableFuture<List<Something>> retreiveAppSomethings(UserApp app) {
return retrieveAppDetails(app).thenCompose(this::retreiveAppDetailSomethings);
}
这一切都是为了使所有内容都不受阻碍,因此,可以可以并行运行的所有内容 都可以并行运行。无需限制任何内容,因为所有内容都将在http客户端的线程池中运行,而这很有可能受到限制。没关系,因为等待不会占用线程。
以上代码所要做的就是实现retrieveUserApps()
,retrieveAppDetails(app)
和retrieveAppDetailSometings(appDetail)
。所有这些都应返回CompletableFuture<>
并使用http客户端的启用异步功能的版本实现。
这将使检索1个应用程序或100个应用程序的数据相同,因为所有这些应用程序都将并行运行(假设它们全部花费相同的时间,并且下游系统可以处理这么多并行请求)。