当一次发送500个请求时,非阻塞弹簧控制器给出503错误

时间:2017-08-25 22:57:00

标签: spring-boot

我一直在尝试进行负载测试(1秒钟内500次请求),以便使用spring boot创建以下三个请求处理程序。受http://callistaenterprise.se/blogg/teknik/2014/04/22/c10k-developing-non-blocking-rest-services-with-spring-mvc/的启发 但我收到了反向输出。 “getUser”-BLOCKING请求处理程序能够在1秒内处理500个请求(但启动了超过200个线程)。 作为NONBLOCKING的“getUser2”和“getUser3”在处理500个请求中的10个请求之后导致503错误。 加特林输出的屏幕截图:https://ibb.co/ePEEBk 有人可以解释一下我的错误原因或原因。

@RequestMapping("/getUser2")
public CompletionStage<Object> getUser2() {
    return CompletableFuture.supplyAsync(()-> {
        try {
            logger.info("");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "result";
    });
}

@RequestMapping("getUser3")
public DeferredResult<String> getUser3() {
    DeferredResult<String> def = new DeferredResult<String>();
    CompletableFuture.runAsync(()-> {
        logger.info("");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).whenCompleteAsync((res,err)-> {
        def.setResult("result");
    });
    return def;
}

@RequestMapping("getUser")
public String getUser() {
    try {
        logger.info("");
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "result";
}

1 个答案:

答案 0 :(得分:0)

我不确定你是否能找到答案。 但是对于getUser3(),看来您的REST api已超时。默认情况下,它将使用Spring MVC的默认超时。 您可以做的一件事就是创建一个带有超时值的DeferredResult。

DeferredResult(java.lang.Long timeout)

有关更多信息,请参见此构造函数https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/context/request/async/DeferredResult.html#DeferredResult-java.lang.Long-

对于getUser,它应该相同,您可能需要更长的超时时间才能对其进行修复