
Мир веб-разработки предлагает бесконечное количество вариантов HTTP-фреймворков для разных языков программирования. Но как разработчикам понять, какие из них обеспечивают действительно высокую производительность? Под катом команда блога CodeReliant* проводит прямое сравнение некоторых из лучших претендентов на быстродействие. Рассматривает популярные варианты на Javascript/Bun, Java, C#, Go и Rust, проводит бенчмаркинг, оценивает их пропускную способность и время отклика при тестировании.
Выбранные для сравнительного анализа фреймворки имеют репутацию высокопроизводительных, — но посмотрим, как это понятие реализуется в разных стеках.
*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис.
Вот пять участников тестирования:
Java 21 + vertex 4.4.6
JS/Bun 1.0.6 + elysiajs 0.7
C# 12 + dotnet/ASP.NET 8.0 RC2
Go 1.21.3 + fiber 2.49.2
Rust 1.73.0 + actix-web 4
С помощью стресс-тестирования мы получим достоверные данные об их возможностях. Наше сравнение "лоб в лоб" фокусируется на скорости и масштабируемости с нулевой конфигурацией, чтобы вы могли выбрать правильный фреймворк для своего следующего веб-проекта с высоким трафиком. Если вы хотите ускорить работу API, создать системы с низкой задержкой или выжать максимум из ваших серверов, это сравнение поможет вам выбрать высокопроизводительный HTTP-фреймворк, подходящий для вашего технологического стека.
Окружение и тестовая система
Для тестирования мы запустим минимальную версию HTTP-сервера, возвращающую ответ hello world при запросе /.
Запустим сервер на машине Hetzner:
ОС: Ubuntu 22.04.3 LTS
Ядро: 5.15.0-86-generic
Архитектура: ARM aarch64
Ресурсы: 4 vCPU & 8 GB RAM
Генератор клиентской нагрузки будет находиться на отдельной машине с аналогичными характеристиками, но большими ресурсами — 8 vCPU и 16 GB RAM.
Java и Vertex
Сгенерируем стартовый проект vertex, используя сайт. Также мы будем использовать java 21-oracle, которую только что установили с помощью sdkman.
package io.codereliant.performance;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
public class MainVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) throws Exception {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello World!");
}).listen(80, http -> {
if (http.succeeded()) {
startPromise.complete();
System.out.println("HTTP server started on port 80");
} else {
startPromise.fail(http.cause());
}
});
}
}Просто изменив порт на 80 вместо 8888 и изменив возвращаемую строку на Hello World вместо текста по умолчанию, мы соберем наш сервер с помощью mvn package и запустим его с помощью java -jar target/performance-1.0.0-SNAPSHOT-fat.jar.
java -jar target/performance-1.0.0-SNAPSHOT-fat.jar
HTTP server started on port 80
Oct 15, 2023 10:56:15 PM io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer
INFO: Succeeded in deploying verticleBun и Elysia
Elysia упрощает создание проекта: сперва вызываем bun create elysia perf-app, а затем — bun run index.ts.
Для справки мы используем Bun 1.0.6 и Elysia 0.7.0.
import { Elysia } from "elysia";
const app = new Elysia().get("/", () => "Hello World").listen(80);
console.log(
` 