gpt4 book ai didi

java - Spring boot 限制 Controller 中特定API的并发调用数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:46:06 32 4
gpt4 key购买 nike

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

登录 Activity 稍微繁重,而获取用户详细信息 api 的重量很轻。

我有一个类似于这个的 Controller

@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 的调用。

最佳答案

有限制 Activity 连接数的解决方案,参见例如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) ) 来限制并发工作,并将您的请求正文提交到该线程池并立即调用返回的 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 上为该解决方案赋予某种超时,或者将这两种解决方案结合起来(这对并发 session 数也有更大的限制)。

关于java - Spring boot 限制 Controller 中特定API的并发调用数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53599675/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com