Java Quarkus开发的GET REST API默认如何处理同接口并发请求?
Quarkus 框架REST接口默认请求处理机制解答
针对你关心的两个核心问题,先给出明确结论:
- 默认场景下没有针对单个GET接口的专属请求队列,不会强制同接口请求串行排队处理
- 默认会启用多线程处理请求,但线程模型和传统Spring Boot/Tomcat这类Servlet栈的「一请求一线程」模型有区别
多线程处理的默认规则
Quarkus 稳定版默认使用 RESTEasy Reactive 作为REST层实现,底层基于Netty运行,启动时会初始化两类线程处理请求:
- IO事件循环线程:默认数量为
CPU核心数 * 2,属于非阻塞线程,禁止在这类线程中执行阻塞操作 - 工作线程池:专门用来处理阻塞型任务,线程数可通过配置调整,默认最大线程数为200
针对普通GET接口的线程调度逻辑:
- 若接口方法没有添加
@Blocking注解,方法内部也不存在JDBC调用、文件读写这类阻塞操作,请求会直接在IO事件循环线程上处理。这类请求不会独占线程,事件循环会以轮询回调的方式快速处理所有挂载的请求,不会为每个请求分配独立线程。 - 若接口方法添加了
@Blocking注解,或者框架检测到方法内存在阻塞操作,会自动将请求调度到工作线程池处理,由空闲的工作线程负责执行接口逻辑,不同请求会被分配给不同工作线程并行处理。
队列机制的实际情况
- 框架层面不存在绑定到单个接口的请求队列,正常情况下只要有可用线程资源,发往同个接口的多个请求会被并行处理,不会等前一个请求处理完再接收下一个。
- 仅当工作线程池的活跃线程数达到配置上限、暂时没有空闲线程时,新提交的阻塞型请求任务会暂时进入工作线程池的全局任务队列等待空闲线程,这个队列是所有阻塞型接口共用的,不是专门给单个GET接口设置的,队列默认长度无界,可通过配置项调整。
- 运行在IO事件循环上的非阻塞请求不会进入等待队列,只要事件循环线程没有被阻塞逻辑占用,请求对应的处理回调会被立刻调度执行。
注意:如果你在业务代码中主动添加了
synchronized同步锁、分布式锁等串行化逻辑,才会出现同接口请求排队执行的情况,这属于业务代码自定义行为,不是Quarkus的默认机制。
内容的提问来源于stack exchange,提问作者Abdullah Imran
相关产品推荐
相关产品推荐

