我们有一个移动应用程序,向用户提供Feed.feed tom API是在tomcat上实现的,它并行调用不同的数据源,如Couchbase,MYSQL来呈现内容.简单的代码如下:
Future<List<CardDTO>> pnrFuture = null;
Future<List<CardDTO>> newsFuture = null;
ExecutionContext ec = ExecutionContexts.fromExecutorService(executor);
final List<CardDTO> combinedDTOs = new ArrayList<CardDTO>();
// Array list of futures
List<Future<List<CardDTO>>> futures = new ArrayList<Future<List<CardDTO>>>();
futures.add(future(new PNRFuture(pnrService, userId), ec));
futures.add(future(new NewsFuture(newsService, userId), ec));
futures.add(future(new SettingsFuture(userPreferenceManager, userId), ec));
Future<Iterable<List<CardDTO>>> futuresSequence = sequence(futures, ec);
// combine the cards
Future<List<CardDTO>> futureSum = futuresSequence.map(
new Mapper<Iterable<List<CardDTO>>, List<CardDTO>>() {
@Override
public List<CardDTO> apply(Iterable<List<CardDTO>> allDTOs) {
for (List<CardDTO> cardDTOs : allDTOs) {
if (cardDTOs != null) {
combinedDTOs.addAll(cardDTOs);
}
}
Collections.sort(combinedDTOs);
return combinedDTOs;
}
}
);
Await.result(futureSum, Duration.Inf());
return combinedDTOs;
Run Code Online (Sandbox Code Playgroud)
现在我们每个请求有大约4-5个并行任务.但随着我们在饲料中引入新种类的物品,预计它将增长到近20-25个并行任务.
我的问题是,我该如何改进这种设计?Tomcat需要进行何种调整才能确保在重负载下最佳地提供20-25个并行调用.
我知道这是一个广泛的主题,但任何建议都会非常有用.
Tomcat只管理传入的HTTP连接并来回推送字节.没有Tomcat优化可以使您的应用程序运行得更好.
如果您需要为每个传入的HTTP请求运行25个并行进程,并且您认为这很疯狂,那么您需要重新思考应用程序的工作方式.
没有tomcat配置可以帮助您在问题中提供的内容.
据我所知,您是通过移动应用程序调用此功能,并且提要数量可能会增加。
根据返回的数据量,是否可以在同一调用中返回某些提要的结果?这样服务器就可以完成工作。您可以控制服务器 - 您无法控制用户设备及其连接速度。
正如 nickebbit 所建议的,DefferedResult 之类的东西确实很容易实现。这些提要中的数据是否有可能不会快速更新?如果是这样 - 您应该研究 EHCache 和 @Cacheable 注释的使用。
您可以想出一个解决方案,让用户始终从 Tomcat 服务器中提取内容的缓存版本。但是您的 tomcat 服务器会在后台不断更新该缓存。
这是一项额外的工作 - 但最终如果用户体验不快 - 用户将不想使用这个应用程序
归档时间: |
|
查看次数: |
171 次 |
最近记录: |