Vertx对原始servlet感到失望

问题描述 投票:0回答:2

[Vertx比执行完全相同的代码的原始asyncservlet慢得多

我已经实现了一个非常基本的GET http方法,该方法在返回http响应文本“ ok”之前没有执行Thread.sleep(30)的功能。我是用jetty-servlet和vertx-verticles做的]

    Vertx vertx = Vertx.vertx();

    DeploymentOptions d = new DeploymentOptions();
    d.setInstances(400);
    d.setWorker(true);
    d.setWorkerPoolSize(400);
    vertx.deployVerticle("com.vertx.Ping",d);

公共类Ping扩展AbstractVerticle {

private HttpServer server;

public void start(Future<Void> startFuture) {

    server = vertx.createHttpServer().requestHandler(req -> {
        try {
            Thread.currentThread().sleep(30);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        req.response().end("ok");
    });

    server.listen(9999);

}

}

ab -k -c 1 -n 1 => servlet和vertx的结果相同:〜31ms

Servlet:ab -k -c 1000 -n 100000在一定时间内服务的请求百分比(毫秒)50%21966%22475%22780%22990%23595%24098%24599%247100%264(最长请求)

Vertx:ab -k -c 1000 -n 100000 => 2分钟后我停止了测试

让我们尝试一些简单的事情:Vertx:ab -k -c 1000 -n 10000(少10倍)

在一定时间内服务的请求百分比(ms)50%393066%394375%396480%397790%399795%400998%401999%4028100%4038(最长请求)

Vertx真该死,我该怎么办错人?谢谢

performance servlets vert.x
2个回答
0
投票

您未按原样使用Vert.x。请记住,Vert.x基于异步操作。

首先,您不需要400个工作台实例。仅1个常规(非工作人员)垂直实例就足够了。之所以这样做,是因为调用了Thread.sleep,这会导致线程阻塞,但是有一种更简单的方法。]

下一个:不要使用阻止操作!您正在事件循环上运行代码,因此请勿阻塞。您的代码应如下所示:

vertx
  .createHttpServer()
  .requestHandler(req -> {
    vertx.setTimer(30, tid -> {
      req.response().end("ok");
    }
  })
  .listen(9999);

[您应该看到您的度量有了显着的改进,所有这些都只有一个线程,而您只有400个线程。

注意:当您需要调用阻塞操作时,应该查看executeBlocking类中的Vertx,该类将一些代码分担给工作程序,然后将结果作为新事件进行分派。


0
投票

甚至更糟。

© www.soinside.com 2019 - 2024. All rights reserved.