我创建了一个Spring Boot(1.4.2)REST应用程序。其中一个@RestController方法需要调用第三方API REST操作(RestOp1),该操作返回100-250条记录。对于RestOp1返回的每个记录,在同一方法中,必须调用同一第三方API(RestOp2)的另一个REST操作。我的第一次尝试涉及使用基于大小为100的固定html" target="_blank">线程池的Controller类级别ExecutorService,以及返回对应于RestOp2响应的记录的Callable:
// Executor thread pool - declared and initialized at class level
ExecutorService executor = Executors.newFixedThreadPool(100);
// Get records from RestOp1
ResponseEntity<RestOp1ResObj[]> restOp1ResObjList
= this.restTemplate.exchange(url1, HttpMethod.GET, httpEntity, RestOp1ResObj[].class);
RestOp1ResObj[] records = restOp1ResObjList.getBody();
// Instantiate a list of futures (to call RestOp2 for each record)
List<Future<RestOp2ResObj>> futureList = new ArrayList<>();
// Iterate through the array of records and call RestOp2 in a concurrent manner, using Callables.
for (int count=0; count<records.length; count++) {
Future<RestOp2ResObj> future = this.executorService.submit(new Callable<RestOp2ResObj>() {
@Override
public RestOp2ResObj call() throws Exception {
return this.restTemplate.exchange(url2, HttpMethod.GET, httpEntity, RestOp2Obj.class);
}
};
futureList.add(future);
});
// Iterate list of futures and fetch response from RestOp2 for each
// record. Build a final response and send back to the client.
for (int count=0; count<futureList.size(); count++) {
RestOp2ResObj response = futureList.get(count).get();
// use above response to build a final response for all the records.
}
至少可以说,上述代码的性能非常糟糕。RestOp1调用(仅调用一次)的响应时间约为2.5秒,RestOp2调用(为每条记录调用)的响应时间约为1.5秒。但是代码执行时间在20-30秒之间,而不是预期的5-6秒!我是不是错过了一些基本的东西?
你的问题包括两部分:
这两个部分是相关的,因为您必须处理每个调用的超时。
您可以考虑使用Spring Cloud(基于Spring引导),并使用一些基于OSSNetflix栈的开箱即用解决方案。
第一个(超时)应该是基于虚拟客户端的断路器hystrix
第二个(多个请求)这是一个架构问题,使用本机执行器不是一个好主意,因为它不会扩展,并且有巨大的维护成本。您可以使用Spring异步方法,这样会有更好的结果,并且完全符合Spring。
希望这会有所帮助。
您正在呼叫的服务速度是否足以每秒处理这么多请求?
RestService有一个异步版本,称为AsyncRestService。你为什么不用这个?
我大概会这样:
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(new ConcurrentTaskExecutor(Executors.newFixedThreadPool(100)));
asyncRestTemplate.exchange("http://www.example.com/myurl", HttpMethod.GET, new HttpEntity<>("message"), String.class)
.addCallback(new ListenableFutureCallback<ResponseEntity<String>>() {
@Override
public void onSuccess(ResponseEntity<String> result) {
//TODO: Add real response handling
System.out.println(result);
}
@Override
public void onFailure(Throwable ex) {
//TODO: Add real logging solution
ex.printStackTrace();
}
});
问题内容: 到目前为止,我以前一直认为Web应用程序只能具有我们在 我这样想对吗? 我可以在一个Web应用程序中拥有多个调度程序Servlet吗?如果是,如何? 在什么情况下我们可能需要这样做? 整个Web应用程序中只能有一个应用程序上下文吗? 我们如何定义多个应用程序上下文? 非Spring应用程序中可以存在吗? 问题答案: 一个Web应用程序中可以有多个调度程序servlet吗? Web应用程
我有一个运行在localhost:3000上的react应用程序,我尝试使用Java ee后端REST服务器调用REST API,运行在localhost:8080上。我已经在头球上启用了CORS。 我试着在我的组件上做一个表单提交post请求。 行中有错误: 选项http://localhost:8080/test/api/rest/service/checkcode 500(Erreur In
我们正在开发一个plone界面来使用来自Web应用程序的REST API服务。用户登录plone并能够访问REST API 问题1)我需要参考哪些Plone编程文档进行设计 查询:2)我需要参考学习的不同技术有哪些 请参阅随附的建议解决方案框图。 .
我正在尝试使用Spring Boot对API进行500次REST调用(POST)。目前,我正在使用线程池,使用可调用的执行器服务,因为我还需要POST调用的响应。在Spring Boot中有没有更有效的方法来实现这一点?编辑-这是一项IO密集型任务
本文向大家介绍使用Odata调用SAPUI5应用程序中的网关时请求超时,包括了使用Odata调用SAPUI5应用程序中的网关时请求超时的使用技巧和注意事项,需要的朋友参考一下 由于您已经尝试了不同的参数,因此建议您检查ICM和Web Dispatcher的超时选项。 在SAP中,您拥有具有不同超时的ICM和Web Dispatcher,这些超时由不同的参数控制: 打开连接的超时:icm / con
我正在构建一个应用程序,它有任意数量的“微社区”。目前,一个用户只能属于一个,所以当他们最初注册时,他们输入一个秘密代码,将他们与相关社区联系起来。 将这些“微社区”(由未来在应用程序上玩一个空间的客户拥有)分离成单独的Firebase项目或将所有数据保存在一起是明智的吗?