阻止与非阻止 - 性能差异

时间:2017-05-14 13:34:30

标签: java spring tomcat blocking nonblocking

我负责实现Websocket端点,其流程顺序如下:

  1. 检查请求是否有效。
  2. 如果有效,请点击另一个后端服务进行分析。
  3. 收到回复后,转换为特定结构并返回客户端。
  4. websocket服务使用Spring 4编写,并在Tomcat 8.5上运行。我在Tomcat中使用默认连接器。

    我有两个选择:

    选项1 - 以阻止方式命中后端服务。

    HttpRequest request = Unirest.get(url).queryString(params);     
    HttpResponse<String> response = request.asString();
    //return response to client.
    

    选项2 - 以非阻塞方式命中后端服务。

    HttpRequest request = Unirest.get(url).queryString(params);
    request.asStringAsync(new Callback<String>() {
    @Override
    public void failed(UnirestException e) {}
    
    @Override
    public void completed(HttpResponse<String> response) {
    String result = response.getBody().toString();
    // return result to client
    });
    

    后端服务的平均响应时间总是约为400毫秒。

    我在&#34;阻止&#34;中加载测试应用程序以及&#34;非阻塞&#34;模式。令我惊讶的是,结果与我的期望略有不同:

    1. &#34;非阻塞&#34;的平均响应时间方法略低于&#34;阻塞&#34;方法
    2. &#34;非阻塞&#34>中出现了更多错误。实施而不是&#34;阻止&#34; (连接,超时错误)。
    3. 垃圾收集正在加班以清除&#34;非阻塞&#34;在JVisualVM中实现高峰值。阻止实施的GC性能更加顺畅。
    4. 结果表明我应该使用阻塞方法而不是非阻塞方法。我错过了什么吗?

1 个答案:

答案 0 :(得分:-1)

CPU使用率和吞吐量是阻塞和非阻塞系统之间的主要区别,有关详细信息,请参阅此内容。

https://www.linkedin.com/pulse/differences-between-blocking-vs-non-blocking-systems-ashish-modi