Spring @RestController 调用大量请求
Spring @RestController invoking large number of requests
我正在使用 Spring Boot 和 @RestController
实现 REST API Java 8. 其中一个控制器方法需要调用另一个第 3 方 REST API服务。方法简述如下(数据格式为JSON):
- 调用第 3 方 API 方法来获取候选人列表(每个候选人都表示为具有一些基本信息的对象)。
- 对于每个候选人,调用另一个第 3 方 API 方法来获取有关候选人的一些更详细的信息。
- 混合结果,实质上是“丰富”第一次调用的所有候选对象。
- Return丰富的候选对象列表。
我计划对第 3 方 API 上的所有调用使用 @RestTemplate
。我担心的是,对于大量候选人(比如 500-1000),如果以阻塞方式实施,这将成为一个巨大的性能瓶颈。我不太确定获得最佳性能的推荐方法是什么。我如何扩展它以便多个用户可以同时访问我的 API?
您的问题非常广泛,我认为没有人能够为您提供详细的答案,但是:
您的案例似乎是 RxJava 的完美用例:通过从其他来源添加额外信息来转换候选人流 - 全部异步完成。
我会跳过 RestTemplate 并选择 Retrofit2 together with their awesome RxJava integration. See this basic tutorial1 and tutorial2。
1000条记录不多,但也要看下游服务的性能。您需要自己进行测试。
如果您想了解更多关于 RxJava 的信息,可以阅读 Tomasz Nurkiewicz 和 Ben Christensen 的一些 great docs online as well as a new amazing book。
祝你好运!
您的应用程序服务器将管理一个线程池,因此许多请求可以同时到达您的端点。除非您的线程池大小为 1,否则多个客户端将能够同时使用您的 API.
进一步解释见此处:
有关如何配置线程池大小的示例,请参见此处:Maximum (client request) thread pool size in spring
为了在向外部服务发出请求时提高性能,我会看看您是否可以进行批量请求(一次多个候选),以减少您发出的请求总数。
Rafal 已经给出了很好的答案。我想加上我的 2 美分。您的案例似乎是非阻塞的完美用例。 RxJava 只是非阻塞反应式编程的一种实现。您也可以使用不同的其他技术栈来实现同样的事情——比如 akka 或 spring boot with netty 或 undertow。
这是我们如何使用 spring 引导进行响应式编程的示例。 https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1 keep in mind that, its still in experimental state. Reactive streams 将内置于 Java 9
对旧话题的回应。以下是一些可以使用的东西。
- 使用 AsyncHttp 而不是 RestTemplate。
- 设置一个单独的线程池(Executor Service)来进行外部调用。
- 尽可能使用 Java8 CompletableFuture.supplyAsync(() -> externalCall(),executorService) 调用外部 API。对于第 3 方调用和嵌套调用。
- Return 用 CompletableFuture 包装到控制器的混搭对象。
我正在使用 Spring Boot 和 @RestController
实现 REST API Java 8. 其中一个控制器方法需要调用另一个第 3 方 REST API服务。方法简述如下(数据格式为JSON):
- 调用第 3 方 API 方法来获取候选人列表(每个候选人都表示为具有一些基本信息的对象)。
- 对于每个候选人,调用另一个第 3 方 API 方法来获取有关候选人的一些更详细的信息。
- 混合结果,实质上是“丰富”第一次调用的所有候选对象。
- Return丰富的候选对象列表。
我计划对第 3 方 API 上的所有调用使用 @RestTemplate
。我担心的是,对于大量候选人(比如 500-1000),如果以阻塞方式实施,这将成为一个巨大的性能瓶颈。我不太确定获得最佳性能的推荐方法是什么。我如何扩展它以便多个用户可以同时访问我的 API?
您的问题非常广泛,我认为没有人能够为您提供详细的答案,但是:
您的案例似乎是 RxJava 的完美用例:通过从其他来源添加额外信息来转换候选人流 - 全部异步完成。
我会跳过 RestTemplate 并选择 Retrofit2 together with their awesome RxJava integration. See this basic tutorial1 and tutorial2。
1000条记录不多,但也要看下游服务的性能。您需要自己进行测试。
如果您想了解更多关于 RxJava 的信息,可以阅读 Tomasz Nurkiewicz 和 Ben Christensen 的一些 great docs online as well as a new amazing book。
祝你好运!
您的应用程序服务器将管理一个线程池,因此许多请求可以同时到达您的端点。除非您的线程池大小为 1,否则多个客户端将能够同时使用您的 API.
进一步解释见此处:
有关如何配置线程池大小的示例,请参见此处:Maximum (client request) thread pool size in spring
为了在向外部服务发出请求时提高性能,我会看看您是否可以进行批量请求(一次多个候选),以减少您发出的请求总数。
Rafal 已经给出了很好的答案。我想加上我的 2 美分。您的案例似乎是非阻塞的完美用例。 RxJava 只是非阻塞反应式编程的一种实现。您也可以使用不同的其他技术栈来实现同样的事情——比如 akka 或 spring boot with netty 或 undertow。
这是我们如何使用 spring 引导进行响应式编程的示例。 https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1 keep in mind that, its still in experimental state. Reactive streams 将内置于 Java 9
对旧话题的回应。以下是一些可以使用的东西。
- 使用 AsyncHttp 而不是 RestTemplate。
- 设置一个单独的线程池(Executor Service)来进行外部调用。
- 尽可能使用 Java8 CompletableFuture.supplyAsync(() -> externalCall(),executorService) 调用外部 API。对于第 3 方调用和嵌套调用。
- Return 用 CompletableFuture 包装到控制器的混搭对象。