HTTP/3 і чому ваш стек вже мертвий

Є максимально проста перевірка. Якщо у вас HTTP працює поверх TCP — у вас все погано. Прямо зараз, без варіантів.

Можна скільки завгодно розповідати про «архітектуру», «патерни» і «best practices», але якщо транспорт старий — у вас стара система. І це навіть не думка. Це факт.

HTTP/3 — це просто новий рівень

Люди дуже люблять ускладнювати. Насправді все просто:

  • було: TCP, проблеми, костилі
  • стало: QUIC (умовний TCP2), цих проблем немає

Все.

Що саме було не так

TCP блокує все, якщо один пакет загубився, довго встановлює з’єднання і ламає продуктивність при будь-якій втраті. І всі такі: «ну ок, так і живемо».

Що робить HTTP/3

HTTP/3 не блокує все підряд, швидше стартує, нормально працює при втраті пакетів і не розвалюється від кожного чиха. Тобто просто робить те, що система і так повинна була робити.

Раніше: один пакет загубився → все стоїть. Зараз: один пакет загубився → нічого страшного. І от на цьому місці різниця між «сайт працює» і «система витримує навантаження».

Але ні, давайте ще поговоримо про патерни

Поки ви обговорюєте «чисту архітектуру», додаєте ще один шар абстракції і пишете ще один wrapper — ви просто ігноруєте реальну проблему. Вона нижче.

Arnelify — коли просто береш і робиш нормально

👉 github.com/...​lify/arnelify-server-rust

Є бібліотека, яка просто дає HTTP/1.1, HTTP/2, HTTP/3, WebSocket і WebTransport — і все це без болю, без цирку, без «давайте ще 10 залежностей».

Зазвичай або пишеш низькорівневий жах, або сидиш на фреймворку, який душить продуктивність. А тут просто нормальний варіант.

Запуск HTTP/3

Встановлення

cargo add arnelify_server

Конфіг

let http3_opts = Http3Opts {
    allow_empty_files: false,
    block_size_kb: 64,
    cert_pem: String::from("certs/cert.pem"),
    charset: String::from("utf-8"),
    compression: true,
    keep_alive: 30,
    keep_extensions: true,
    key_pem: String::from("certs/key.pem"),
    max_fields: 10,
    max_fields_size_total_mb: 1,
    max_files: 3,
    max_files_size_total_mb: 60,
    max_file_size_mb: 60,
    port: 4433,
    storage_path: String::from("/var/www/rs/storage"),
    thread_limit: 4,
};

Так, параметрів багато — так і має бути.

Логування

let http3_logger: Arc<Http3Logger> = Arc::new(
    move |_level, message| {
        println!("[Arnelify Server]: {}", message);
    },
);

http3.logger(http3_logger);

Якщо у вас немає логів — ви просто не знаєте, що у вас відбувається.

Handler

let http3_handler: Arc<Http3Handler> = Arc::new(
    move |ctx: Arc<Mutex<Http3Ctx>>,
          stream: Arc<Mutex<Http3Stream>>| {
        let json = ctx.lock().unwrap().clone();
        let mut stream_lock = stream.lock().unwrap();
        stream_lock.set_code(200);
        stream_lock.push_json(&json, false);
        stream_lock.end();
    },
);

Запуск

http3.on("/", http3_handler);
http3.start();

І все працює — без «тиждень підняти інфраструктуру».

WebTransport

Швидко, двосторонньо, нормально. І воно вже тут.

Висновок

TCP — старе, QUIC — нове, HTTP/3 — нормальний варіант, Arnelify — просто бери і використовуй.

👉 github.com/...​lify/arnelify-server-rust

Далі вже як хочете: або продовжуєте робити вигляд, що все ок, або переходите на рівень, де система реально працює.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному1
LinkedIn
Ctrl + Enter
Ctrl + Enter
якщо транспорт старий — у вас стара система

Один раз попадешся на тому що щось критично важливе не працює на зумерському QUIC, умовно, типу ковідного сертифікату в дії на паспортному контролі в 2021 році, бо хтось заблокував все що не 443/TCP на вайфаї аеропорту, а роумінг не працює, і розуміння що таке старий транспорт і чи це погано радикально зміниться.

Виглядає як цікава R&D-ідея, але не як продакшн-рішення.
Немає:
бенчмарків
тестів / load-тестів
кейсів реального використання
опису безпеки
Твердження про «TCP застарів» — перебільшення, більшість систем стабільно працює на TCP.
Також є питання довіри. Я не знайшов підтверджень, що Arnelify — це реальна активна компанія з командою, а не solo-проєкт. Згадки про інших учасників (наприклад, Robert) не підкріплені публічною активністю.
Ідея з HTTP/3 / WebTransport — ок як експеримент, але без метрик і adoption порівняння з Kafka / NATS виглядає передчасним.
Поки що це більше pet-проєкт без валідації, ніж готова технологія.

Ті, хто переймається подібними питаннями, зазвичай використовують Nginx.

Щоб увімкнути HTTP/2 та HTTP/3 в Nginx, достатньо додати такі налаштування:

# HTTP/2
listen 443 ssl;
http2 on;

# HTTP/3
listen 443 quic reuseport;
add_header Alt-Svc 'h3=":443"; ma=86400' always;

целая одна звезда на гитхабе
транспортную либу пока менять не буду, подожду, пока хотя бы две не наберется

Висновок хибний, якщо у вас із гори стоїть проксі — спочаику Ingress або Instio що базуються на NGNX, далі Amazon API Gateway чи навіть Google Claud API Gateway — то вони не підтримують HTTP/3 і по суті усе не працює, жодних переваг.
Ну і як щазвичай крли проблеми із навантаженням в 80% — випадків ботлнек в базі данних.

А цей модний quic як працює? (Якому рочків більше ніж середньому сеньйору на ринку, але чомусь не дуже спішать усюди пхать)
Це ж напевно старий не модний UDP
Ох ці захоплення всемогутнім udp ...
А як там з congestion control? Який відсутній...
По забивають канали вашими UDP і нормальні пацани на TCP мучаться

Сорян, виявляється congestion control завезли. Але ключове — це опція. Можна юзати можна ні, на відміну від TCP що вшитий в операційну систему

Підписатись на коментарі