繁体   English   中英

Spring boot限制控制器中特定API的并发调用次数

[英]Spring boot Limit number of concurrent invocations of a specific API in a controller

我有一个基于sprint启动(v1.5.15)的Restful应用程序,它提供基于用户的服务,特别是登录和获取用户详细信息。

登录活动稍微沉重,因为获取用户详细信息api非常轻。

我有一个类似于此的控制器

@RestController
public class UserController{

    @PostMapping("/login")
    public LoginResponse userLogin(@RequestBody LoginRequest loginRequest){
        ...
    }

    @GetMapping("/users/{id}")
    public LoginResponse userIdGet(@PathVariable("id") String id){
        ...
    }

}

有什么办法可以限制对/login api的并发调用次数。 基本上我想将此限制为x,因为/users/{id}可以在相同的资源中处理大约10倍的调用。

应用程序使用嵌入式tomcat服务器,我知道server.tomcat.max-connectionsserver.tomcat.max-threadsserver.tomcat.min-spare-threads但是这些限制了应用程序级别而不是API的调用。

有些解决方案可以限制活动连接的数量,例如https://dzone.com/articles/how-to-limit-number-of-concurrent-user-session-in

然而,afaik,这样的解决方案只是拒绝进一步的请求。

如果您不想拒绝请求,则可以使用应用程序范围内的固定线程池ExecutorService来限制并发工作( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent /Executors.html#newFixedThreadPool(int) )并将您的请求正文提交到该线程池,并且imediatly调用get返回的Future。

所以你可以替换

@PostMapping("/api/xyzMethod")
public Response xyzMethod(@RequestBody Request request) {
    return handleXyzMethod(request); });
}

通过

@PostMapping("/api/xyzMethod")
public Response xyzMethod(@RequestBody Request request) throws InterruptedException, ExecutionException {
    return xyzMethodExecutor.submit(() -> { return handleXyzMethod(request); }).get();
}

和一些

private static ExecutorService xyzMethodExecutor = Executors.newFixedThreadPool(10);

缺点是用户可能必须等待回复和/或多个请求将填充线程池队列,直到服务变得(太)无响应。 因此,您可能需要在FutureTasks上为此解决方案赋予某种超时或将两种解决方案结合起来(这对并发会话的数量也有更大的限制)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM