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
Далі вже як хочете: або продовжуєте робити вигляд, що все ок, або переходите на рівень, де система реально працює.
8 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівОдин раз попадешся на тому що щось критично важливе не працює на зумерському 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, достатньо додати такі налаштування:
целая одна звезда на гитхабе
транспортную либу пока менять не буду, подожду, пока хотя бы две не наберется
Висновок хибний, якщо у вас із гори стоїть проксі — спочаику Ingress або Instio що базуються на NGNX, далі Amazon API Gateway чи навіть Google Claud API Gateway — то вони не підтримують HTTP/3 і по суті усе не працює, жодних переваг.
Ну і як щазвичай крли проблеми із навантаженням в 80% — випадків ботлнек в базі данних.
А цей модний quic як працює? (Якому рочків більше ніж середньому сеньйору на ринку, але чомусь не дуже спішать усюди пхать)
Це ж напевно старий не модний UDP
Ох ці захоплення всемогутнім udp ...
А як там з congestion control? Який відсутній...
По забивають канали вашими UDP і нормальні пацани на TCP мучаться
Сорян, виявляється congestion control завезли. Але ключове — це опція. Можна юзати можна ні, на відміну від TCP що вшитий в операційну систему
Навіщо цей ШІ-слоп тут?