Разочарован Vertx против сырого сервлета - PullRequest
0 голосов
/ 27 сентября 2019

Vertx намного медленнее, чем необработанный асинхронный сервлет с точно таким же кодом для выполнения

Я реализовал очень простой метод GET http, который ничего не делает, кроме Thread.sleep (30), прежде чем возвращать текст ответа http "ok",Я сделал это с помощью jetty-сервлета и vertx-ver vert

    Vertx vertx = Vertx.vertx();

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

открытый класс Ping extends 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 -n1 => один и тот же результат для сервлета и вершины: ~ 31 мс

сервлет: ab -k -c 1000 -n 100000 Процент запросов, обслуживаемых в течение определенного времени (мс) 50% 219 66% 224 75% 22780% 229 90% 235 95% 240 98% 245 99% 247 100% 264 (самый длинный запрос)

Vertx: ab -k -c 1000 -n 100000 => через более чем 2 минуты я остановил тест

Давайте попробуем что-нибудь попроще: Vertx: ab -k -c 1000 -n 10000 (в 10 раз меньше)

Процент запросов, обработанных за определенное время (мс) 50% 3930 66%3943 75% 3964 80% 3977 90% 3997 95% 4009 98% 4019 99% 4028 100% 4038 (самый длинный запрос)

Vertx так чертовски медленен, что я делаю не так, ребята?Спасибо

1 Ответ

1 голос
/ 27 сентября 2019

Вы используете Vert.x не так, как должно быть.Помните, что Vert.x основан на асинхронных операциях.

Во-первых, вам не нужно 400 экземпляров рабочих вертикалей.Достаточно одного обычного (не рабочего) экземпляра статьи.Вы делаете это потому, что вызываете Thread.sleep, что приводит к блокировке потока, но есть гораздо более простой способ.

Далее: не используйте операции блокировки!Вы выполняете код в цикле обработки событий, поэтому вы не должны блокировать.Ваш код должен выглядеть следующим образом:

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

Вы должны увидеть резкое улучшение ваших показателей, и все это всего с 1 потоком по сравнению с 400 у вас.

Примечание: когда вычтобы вызвать блокирующую операцию, вам нужно взглянуть на executeBlocking в классе Vertx, который выгружает некоторый код работнику, а затем отправляет результат как новое событие.

...