如何提高内部其他REST调用的REST调用的性能

时间:2018-10-23 07:30:52

标签: java multithreading rest caching pagination

我正在创建一个端点,该端点检索我一些数据,并且在此调用中它调用了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调用来支持分页。

由于没有数据库,因此无法添加分页。 有什么解决办法吗?

1 个答案:

答案 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个应用程序的数据相同,因为所有这些应用程序都将并行运行(假设它们全部花费相同的时间,并且下游系统可以处理这么多并行请求)。