我正在使用Spring Boot实现REST API,使用Java 8实现@RestController
。其中一个控制器方法需要调用另一个第三方REST API服务。该方法概述如下(数据格式为JSON):
我计划在第三方API上使用@RestTemplate
进行所有调用。我担心的是,对于大量候选人(比如说500-1000),这将成为一个巨大的性能瓶颈,是以阻塞的方式实现的。我不太确定推荐的最佳性能方法是什么。如何对此进行扩展,以便多个用户可以同时访问我的API?
答案 0 :(得分:4)
您的问题非常广泛,我认为没有人能够为您提供详细的答案,但是:
您的案例似乎是RxJava的完美用例:通过添加其他来源的其他信息进行转换的候选流 - 所有这些都是异步的。
我会跳过RestTemplate并与他们真棒的RxJava集成一起去Retrofit2。请参阅此基本tutorial1和tutorial2。
1000条记录并不多,但它也取决于下游服务的性能。您需要自己测试一下。
如果您想了解更多有关RxJava的内容,有一些great docs online以及Tomasz Nurkiewicz和Ben Christensen的new amazing book。
答案 1 :(得分:1)
拉法尔已经给出了一个很好的答案。我想加2美分。您的案例似乎是非阻止的完美用例。 RxJava只是非阻塞响应式编程的一种实现。您也可以使用不同的其他技术堆栈来实现相同的功能 - 例如akka或带有netty或underow的spring boot。
这是我们如何使用spring boot进行响应式编程的示例。 https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1请记住,它仍处于实验状态。 Reactive streams将内置于Java 9
中答案 2 :(得分:0)
您的应用程序服务器将管理线程池,因此许多请求可以同时命中您的端点。除非您的线程池大小为1,否则多个客户端将能够同时使用您的API。
有关详细说明,请参阅此处:Spring MVC Rest Services - Number of Threads (Controller Instances)
请参阅此处了解如何配置线程池大小的示例:Maximum (client request) thread pool size in spring
为了在向外部服务发出请求时提高性能,我会看看您是否可以批量请求(一次多个候选人),以减少您提出的请求总数。
答案 3 :(得分:0)
对旧线程的响应。下面是一些可以使用的东西。