🔥 HTTP/3: Когда HTTP/2 было недостаточно ебать мозги


Yegor Karpachev

Спойлер: Вы внедрили UDP, потому что Олег прочитал статью на Хабре

Я 15 лет смотрю, как превращаются нормальные технологии в говно. Но HTTP/3 — это особый уровень мазохизма. Это когда собака три раза обнюхала TCP, поняла что всё норм, а вы решили: "А хуй с ним, давайте UDP!"


📊 Статистика для тех, кто думает головой (спойлер: не для вас)

По данным HTTP Archive (httparchive.org, февраль 2025) — 32% сайтов поддерживают HTTP/3, но только 8% трафика реально идёт через него. Знаете почему? ПОТОМУ ЧТО ОНО НЕ РАБОТАЕТ КАК ОБЕЩАЛИ.

Cloudflare опубликовали исследование в декабре 2024: в 67% случаев HTTP/2 быстрее HTTP/3 для типичных веб-сайтов. Но вам же похуй на исследования, правда? Вам нужно в резюме написать "внедрил HTTP/3", а что сайт стал тормозить — это проблема следующего техлида.

Chrome DevTools показывает 15-20% увеличение latency после миграции на HTTP/3 для пользователей за NAT. Но это же "детали", да? Олег Викторович сказал "надо быть современными" — значит делаем.


🐕 Сравнение #1: Собака vs Ваш Техлид

Собака видит UDP пакет, обнюхивает его, понимает что это ненадёжный протокол без гарантий доставки, и идёт дальше. Собака не будет строить критическую инфраструктуру на UDP, потому что у неё есть инстинкт самосохранения.

Ваш техлид Петров П.П. видит статью "HTTP/3 is the future!" на Medium, оргазмирует, заставляет команду три месяца переписывать nginx-конфиги, добавляет QUIC, ломает мониторинг (потому что Prometheus не понимает UDP), а когда latency вырастает на 15% — говорит "ну это временно, надо просто настроить".

Собака умнее. Факт.


💩 Как это происходит в реальности

Понедельник, 10:00

CTO Иванов И.И.: "Ребят, я тут почитал — HTTP/3 даёт прирост производительности! Надо внедрять!"

Вопрос от разработчика: А у нас есть проблемы с HTTP/2?

Ответ: Нет, но мы должны быть впереди!

Вопрос: А мы понимаем, что UDP блокируется 40% корпоративных файрволов?

Ответ: Детали! Главное — стратегия!


Через месяц

Разработчик смотрит в логи nginx:



nginx

# /etc/nginx/nginx.conf
# БЛЯТЬ, КТО ЭТО НАПИСАЛ

listen 443 quic reuseport;
listen 443 ssl;

# Фоллбэк на HTTP/2, потому что HTTP/3 не работает
# в 60% случаев, но мы же "инновационные"
ssl_early_data on;  # Это вообще дыра безопасности
add_header Alt-Svc 'h3=":443"; ma=86400';  # Спойлер: клиенты игнорируют

Комментарий в коде:



javascript

// TODO: разобраться почему QUIC connection timeout
// каждые 30 секунд за корп. файрволом
// UPD: Иванов сказал "не приоритет"
// UPD2: уволился, хуй с ним

Через два месяца

Мониторинг показывает:

  • Connection establishment time вырос с 80ms до 120ms
  • 40% запросов фоллбэкают на HTTP/2 через 3 секунды таймаута
  • CPU load на балансировщиках +35% (потому что QUIC — это криптография на каждом пакете, гении)

Иванов И.И. на планёрке: Ну это просто нужно донастроить! Кто у нас отвечает за производительность?

Ответственный уволился неделю назад.


🔬 Медицинская справка: Диагноз вашей архитектуры

HTTP/3 в вашем случае — это раковая опухоль. Не потому что технология плохая, а потому что вы внедрили её БЕЗ ПОКАЗАНИЙ.

У вас не было:

  • Head-of-line blocking (потому что у вас 90% запросов — это API с одним ресурсом)
  • Проблем с packet loss (потому что ваши пользователи не в шахте Интернета)
  • Проблем с connection migration (потому что мобильное приложение у вас вообще нет)

Зато теперь есть:

  • Гангрена мониторинга — Prometheus не видит UDP метрики
  • Некроз отладки — Wireshark показывает зашифрованное говно
  • Сепсис инфраструктуры — балансировщики жрут CPU как не в себя

Формула успеха: Хайп × Некомпетентность = Пиздец²


🐕 Сравнение #2: Собака vs Product Manager

Диалог с PM:

PM Сидоров С.С.: Слушай, я тут с клиентом говорил — они хотят HTTP/3!

Разработчик: Они знают что это такое?

PM: Ну... они сказали "хотим быстрый сайт"

Разработчик: У них сайт за 8 секунд грузится потому что вы картинки по 5Мб заливаете БЕЗ оптимизации

PM: Ну да, но HTTP/3 же быстрее?

Разработчик: ...

Собака в этот момент: Понимает, что картинка 5Мб будет тормозить на любом протоколе, даже если ты её телепортируешь через квантовую запутанность.

PM Сидоров С.С.: Не понимает, пишет в Jira задачу "Внедрить HTTP/3 для ускорения сайта, ASAP, critical".

Собака снова умнее. Я устал это повторять.


🎪 Цирк с конями: Реальные кейсы

Кейс #1: Финтех-стартап "ИнновацииБлять"

Что хотели: Обогнать конкурентов технологически

Что сделали: Внедрили HTTP/3 на фронтенд

Что получили:

  • 25% пользователей за корпоративными прокси не могут зайти (UDP заблокирован)
  • Банк клиента отказался работать через HTTP/3 (требования ИБ)
  • Техлид Жопин Ж.Ж. три месяца разбирался почему Safari на iOS 15 рандомно отваливается
  • В production откатились на HTTP/2, но Жопин в презентации инвесторам всё равно говорит "мы на HTTP/3"

Мораль: Пиздёжь в презентациях — единственное, что работает стабильно.


Кейс #2: E-commerce "УБейСебя.ру"

Контекст: Средний чек 3000₽, средний возраст пользователя 45 лет, сидят с офисных компов в регионах.

СТО Круглов К.К. решил: Нам нужен HTTP/3, потому что Ozon же перешёл!

Реальность:

  • У Ozon — тысячи инженеров, собственный CDN, контроль над инфраструктурой
  • У УБейСебя.ру — три бэкенд-разработчика, shared хостинг на Timeweb, и админ Вася который "типа DevOps"

Результат внедрения:



bash

# Логи nginx от Васи
[error] 23415#23415: *12847 QUIC packet too short while processing QUIC connection
[error] 23415#23415: *12848 QUIC connection handshake failed
[error] 23415#23415: *12849 SSL_do_handshake() failed (SSL: error:14094410)

# Вася в чате:
# "Ребят, что-то сломалось, надо откатывать"
# Круглов К.К.: "НЕ ОТКАТЫВАТЬ! ЭТО ВРЕМЕННО!"

Через неделю конверсия упала на 12%. Через две — откатили. Круглов уволился "по собственному", но в LinkedIn написал "Successfully led HTTP/3 migration".


🔥 Почему вы РЕАЛЬНО внедрили HTTP/3 (честный список)

✅ "Чтобы в резюме написать"

✅ "Начальник прочитал статью"

✅ "Конкуренты вроде используют" (спойлер: не используют)

✅ "На конференции выступить не о чем"

✅ "Hacker News сказали что это круто"

❌ "У нас измеримые проблемы с производительностью HTTP/2"

❌ "Мы провели A/B тесты и увидели прирост"

❌ "Наша инфраструктура готова"

❌ "Мы понимаем трейдоффы"

❌ "У нас есть plan B"


🐕 Сравнение #3: Собака vs Архитектор Решений

Собака подходит к миске:

  • Нюхает еду
  • Проверяет не испортилась ли
  • Ест только если уверена
  • Если сомневается — не ест

Архитектор решений Петухов П.П. подходит к технологии:

  • Видит слово "modern" в заголовке
  • НЕ читает документацию (там 300 страниц, некогда)
  • НЕ проверяет совместимость
  • НЕ делает proof of concept
  • Сразу утверждает миграцию на production
  • Когда всё падает: "Ну кто ж знал!"

Собака не просрала бы бюджет на 3 месяца разработки. Вы — просрали.


🧪 Формулы для тех, кто верит в математику

Формула успеха HTTP/3:



Прирост производительности = (Пакет loss × 0.3) − (CPU overhead × 2) − (Debugging time × ∞)

Формула принятия решений в вашей компании:



Вероятность внедрения = (Громкость хайпа / Квалификация CTO) × Близость дедлайна²

Формула "инноваций":



Technical Debt = Σ(Модные технологии − Реальные проблемы) × Время до увольнения

💀 Что происходит ПОСЛЕ внедрения

Месяц 1: Все довольны, метрики не смотрят (потому что не настроили).

Месяц 2: Начинаются "странные" проблемы:

  • "Почему-то с офиса клиент не открывается"
  • "В мобильном Chrome иногда виснет"
  • "Яндекс.Метрика показывает рост отказов на 8%"

Месяц 3: DevOps Задрищенко З.З. уходит в отпуск, а в это время:



python

# monitoring/alerts.py
# Алерты которые теперь не работают

def check_http_response_time():
    # TODO: это для TCP, а у нас UDP, хуй знает как мерить
    # Задрищенко обещал переписать, но он в отпуске
    # А потом уволился
    pass

def check_ssl_certificate():
    # QUIC использует другую схему сертификатов
    # Prometheus их не видит
    # Сертификат протух 3 дня назад, никто не заметил
    # Спойлер: заметили когда всё упало
    pass

Месяц 4: Новый техлид предлагает откатиться на HTTP/2. Менеджмент против — "мы же столько вложили!"

Месяц 6: Тихо откатываются на HTTP/2, в релиз-нотах пишут "оптимизация протокола".


🎭 Диалоги которые вы слышали (и проигнорировали)

Senior разработчик → CTO:

"Может сначала оптимизируем бандлы? У нас там React включён целиком, 2.5Мб JavaScript'а."

CTO Долбоёбов Д.Д.: "Это не стратегически. HTTP/3 — вот что нужно."

Результат: HTTP/3 внедрили, бандлы не оптимизировали. Сайт грузится 6 секунд вместо 5.5. Победа!


DevOps → Архитектор:

"У нас Terraform не поддерживает настройку QUIC в AWS ALB."

Архитектор Мудаков М.М.: "Ну сделай руками пока."

Результат: Инфраструктура как код превратилась в "инфраструктуру как ручками и молитвой". Через месяц никто не помнит что где настроено.


QA → Product Manager:

"Мы не можем тестировать HTTP/3 в автотестах, инструменты не поддерживают."

PM Дундук Д.Д.: "Ну протестируйте руками."

Результат: E2E тесты стали бесполезны. Баги находят пользователи. В production. По пятницам.


🏥 Клинический случай: Netflix vs Вася-стартап

Netflix внедрил HTTP/3:

  • 5 лет R&D
  • Dedicated команда из 50+ инженеров
  • Собственный CDN на 200,000+ серверов
  • Тысячи A/B тестов
  • Постепенный rollout с мониторингом каждой метрики
  • Результат: 2% прирост производительности в специфичных кейсах (мобильные сети с высоким packet loss)

Вася-стартап "ПодпискиНаВсё.io" внедрил HTTP/3:

  • 0 дней исследований ("мы прочитали что Netflix использует!")
  • 1 разработчик (джун, который "типа знает Docker")
  • Shared хостинг у непонятного провайдера
  • Ноль тестов ("это же просто в nginx включить!")
  • Включили за 2 часа в пятницу вечером
  • Результат: Сайт лёг, weekend без сна, в понедельник откат, CEO Васильев В.В. орёт "КТО РАЗРЕШИЛ"

Мораль: Если Netflix — это хирург с 20-летним опытом, то вы — пьяный санитар с кухонным ножом. Не повторяйте операции которые видели по телевизору.


🔨 Технические последствия которые вы получили бесплатно

Debugging превратился в ад:

Раньше: tcpdump port 443 — смотришь HTTP/2 фреймы, всё понятно.

Теперь: UDP пакеты, всё зашифровано, QUIC connection ID рандомный, логи nginx ничего не говорят, Wireshark показывает абракадабру. Нужен qlog, но его никто не настроил. Баг воспроизводится раз в неделю. Удачи.

Файрволы и прокси:

40% корпоративных пользователей за firewall который блокирует UDP. Ваше "решение": Alt-Svc заголовок с фоллбэком на HTTP/2. Проблема: 3 секунды таймаута на каждую попытку QUIC connection. Пользователь ждёт, злится, уходит к конкурентам.

Мониторинг умер:

Prometheus не умеет UDP. DataDog выдаёт половину метрик. Grafana показывает "N/A". На планёрке все делают вид что всё ок. Никто не знает реальных цифр. Решения принимаются на основе "ну вроде работает".

Load balancers горят:

QUIC — это криптография на каждом пакете. TCP offload на сетевых картах не работает для UDP. CPU на балансировщиках +40%. AWS выставил счёт в два раза больше. Финдир Жадинов Ж.Ж. вызывает на ковёр: "Что за перерасход?" Вы объясняете про HTTP/3. Он не понимает ни слова. Бюджет урезают.


🤮 Код который вы теперь поддерживаете



go

// internal/server/http3.go
// Написано Джуном Петей в 3 часа ночи после 5 Red Bull

package server

import (
    "context"
    "crypto/tls"
    "github.com/lucas-clemente/quic-go/http3"
    // TODO: эта либа deprecated, но мы пока не переписали
    // UPD: автор либы сказал "используйте другую"
    // UPD2: другая либа несовместима, надо всё переписывать
    // UPD3: забили хуй
)

func (s *Server) StartHTTP3() error {
    // FIXME: хардкод, но "потом вынесем в конфиг"
    // Спойлер: не вынесли
    server := &http3.Server{
        Addr: ":443",
        // БЛЯТЬ настройки QUIC скопированы с StackOverflow
        // Никто не понимает что они делают
        QuicConfig: &quic.Config{
            MaxIdleTimeout:  time.Second * 30,  // Random value
            KeepAlivePeriod: time.Second * 20,  // Another random value
            // EnableDatagrams: true,  // Что это? Хуй знает, закомментили
        },
    }
    
    // Обработка ошибок — для слабаков
    go server.ListenAndServe()
    
    // TODO: graceful shutdown
    // TODO: health checks
    // TODO: metrics
    // TODO: вообще это всё переписать нормально
    
    return nil  // Always return nil, что может пойти не так?
}

// WARNING: Этот код в production
// WARNING: Автор уволился
// WARNING: Комментарии старше чем ваш контракт

📉 Графики которые вы не показываете менеджменту

До HTTP/3:

  • Response time P95: 150ms
  • Error rate: 0.1%
  • Happy пользователи: 95%

После HTTP/3:

  • Response time P95: 180ms (но мы говорим "в пределах нормы")
  • Error rate: 0.8% (но мы говорим "статистическая погрешность")
  • Happy пользователи: 87% (но мы не смотрим на NPS)
  • Баги в беклоге с тегом "http3": 47 (но они "не приоритетные")

На презентации инвесторам:

  • "Мы внедрили современный HTTP/3!"
  • "Мы технологические лидеры!"
  • Показывают график хостинга с Хабра, а не свои метрики

🎯 Для кого HTTP/3 реально имеет смысл

Вы Netflix, YouTube, Cloudflare? → Окей, внедряйте.

У вас миллиарды запросов в день и собственная команда protocol engineers? → Пожалуйста.

Ваши пользователи в Индии на 3G с 15% packet loss? → Может быть.

Вы SaaS стартап с 5000 пользователей на AWS за reverse proxy и самая большая проблема — это PM который тупит? → ИДИ НАХУЙ. Оптимизируй SQL запросы, уменьшай бандлы, настрой кэширование. HTTP/3 тебе не поможет, долбоёб.


🎪 Особое достижение: Kubernetes + HTTP/3

Отдельный поклон ебанатам которые решили: "А давайте HTTP/3 в Kubernetes!"

Проблема #1: Ingress controller (nginx/traefik) поддерживает HTTP/3, но:

  • Надо настроить UDP load balancing
  • Надо пробросить UDP порты через Service
  • Надо настроить CNI plugin который умеет UDP
  • Надо чтобы облачный LB умел UDP (спойлер: не все умеют)

Проблема #2: Service mesh (Istio/Linkerd) НЕ умеет HTTP/3. Вообще. Ваша красивая схема с mTLS, circuit breakers, и observability — НЕ РАБОТАЕТ. Молодцы.

Проблема #3: Cert-manager выпускает сертификаты для TCP TLS. Для QUIC нужны другие настройки. Никто не читал документацию. Сертификаты "вроде работают", но раз в месяц всё падает.

Реальный манифест который я видел:



yaml

# k8s/ingress-http3.yaml
# Написано "DevOps инженером" Колей который
# прошёл курсы "Kubernetes за неделю"

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
  annotations:
    # FIXME: это не работает в AWS ELB
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    # TODO: разобраться почему UDP не проходит
    # UPD: прошло 6 месяцев, так и не разобрались
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
  - name: https
    port: 443
  - name: http3
    port: 443
    protocol: UDP  # Спойлер: AWS NLB требует отдельный порт для UDP
    # Но мы используем 443 для TCP и UDP одновременно
    # Это работает? НЕТ
    # Мы это чинили? НЕТ
    # Почему? ПОТОМУ ЧТО КОЛЯ УВОЛИЛСЯ

Результат: HTTP/3 не работает в K8s, но в презентации написали "Cloud-native architecture with HTTP/3 support". Инвесторы впечатлены. Пользователи — нет.


💸 Сколько вы просрали (финансовая сводка)

3 месяца разработки = 3 разработчика × 300k₽ = 900k₽

2 месяца отладки = DevOps + 2 разработчика × 300k₽ = 600k₽

Увеличение инфраструктуры (CPU, траффик, балансировщики) = +150k₽/месяц

Потерянная конверсия (8% отказов × средний чек) = ~500k₽

Время техлида на митинги "почему не работает" = бесценно

ИТОГО: ~2.5 млн рублей на то, чтобы сайт стал медленнее.

Альтернатива на эти деньги:

  • Нанять performance engineer который оптимизирует что реально тормозит
  • Купить нормальный CDN (Cloudflare Business)
  • Настроить кэширование
  • Оптимизировать базу данных (где у вас запросы по 2 секунды)
  • Сжать картинки (у вас там PNG по 10Мб)

Что выбрали: HTTP/3, потому что "это же инновации!"


🧠 Психологический портрет внедряющего

Стадия 1: Хайп (неделя 1) "Мы будем как Google! HTTP/3 — это будущее!"

Стадия 2: Энтузиазм (месяц 1) "Ну ничего, небольшие проблемы, сейчас разберёмся!"

Стадия 3: Отрицание (месяц 2) "Это не баг, это feature! Просто надо правильно настроить!"

Стадия 4: Гнев (месяц 3) "ПОЧЕМУ БЛЯТЬ ЭТА ХУЙНЯ НЕ РАБОТАЕТ?!"

Стадия 5: Депрессия (месяц 4) "Может мы зря это затеяли..."

Стадия 6: Принятие (месяц 5) "Окей, откатываемся на HTTP/2"

Стадия 7: Ложь (месяц 6) В LinkedIn: "Successfully migrated to HTTP/3 architecture"

В резюме: "Led performance optimization initiatives"

В реальности: Просрали бюджет и время.


🔥 Советы для долбоёбов-менеджеров

1. Прекратите читать TechCrunch

Каждая статья там — это реклама. "Company X migrated to HTTP/3" — это PR пост, а не техническая документация. Если хотите принимать решения — читайте research papers, а не Medium посты от стартапов которые ищут инвестиции.

2. Спрашивайте "а какую проблему это решает?"

Если разработчик не может объяснить конкретную измеримую проблему которую решает HTTP/3 — это значит проблемы нет. Не надо решать проблемы которых нет.

3. Требуйте A/B тесты

"Давайте сравним HTTP/2 vs HTTP/3 на 10% трафика в течение месяца" — это нормальный подход. "Давайте прямо завтра всё переключим" — это подход дебила.

4. Проверяйте что говорят разработчики

Если senior говорит "это плохая идея" — может он прав? Не надо игнорировать экспертизу ради "инноваций". Вы нанимаете людей чтобы они думали, а не кивали.

5. Считайте ROI

Если миграция стоит 2 млн и 3 месяца, а прирост производительности 2% (который никто не заметит) — может не надо? Может лучше потратить эти деньги на маркетинг? Или на исправление багов которые бесят пользователей?


🛠 Советы для разработчиков которые ещё не сдохли

1. Научитесь говорить "нет"

"Нет, мы не будем внедрять HTTP/3 потому что у нас нет для этого оснований" — это нормальная фраза. Вы профессионал, а не робот который делает что скажут.

2. Требуйте метрики

"Покажите мне профайлинг который показывает что HTTP/2 — узкое место" — если нет профайлинга, нет проблемы, нет решения.

3. Делайте proof of concept

Перед тем как пилить в production — сделайте PoC. Неделя на эксперимент это норм. Три месяца разработки без проверки гипотезы — идиотизм.

4. Документируйте решения

Пишите ADR (Architecture Decision Records). "Мы выбрали HTTP/3 потому что..." — когда через год всё будет гореть, этот документ спасёт вашу жопу. Или хотя бы покажет кто виноват.

5. Планируйте откат

"Если не взлетит — как откатимся?" — если на этот вопрос нет ответа, то не начинайте. Feature flags, blue-green deployment, постепенный rollout — это базовые вещи.

6. Не верьте хайпу

HTTP/3, WebAssembly, Blockchain, AI, Microservices — всё это инструменты. Не цели. Цель — решать проблемы бизнеса. Если новая технология не решает конкретную проблему — она не нужна.


🎬 Финальные титры

Я потратил 15 лет на то чтобы смотреть как вы превращаете нормальные технологии в франкенштейна. HTTP/3 — это просто последний пример в длинной череде "инноваций" которые были внедрены потому что "модно", а не потому что "нужно".

Запомните простое правило:

Если вы не можете объяснить ЗАЧЕМ вам нужна технология в трёх предложениях без buzzwords — она вам нахуй не нужна.

HTTP/3 решает:

  • Head-of-line blocking в условиях packet loss
  • Connection migration при смене сети
  • Faster handshake в специфичных кейсах

Если у вас нет этих проблем — НАХУЙ ВАМ HTTP/3?

Но нет, вы будете внедрять, потому что "конкуренты вроде используют", потому что "в резюме красиво звучит", потому что "CTO прочитал статью".

И через полгода будете искать нового техлида, потому что предыдущий выгорел на отладке вашей хуйни.


📚 Ссылки для тех кто хочет поумнеть (спойлер: не для вас)

Исследования с реальными данными:

  • Cloudflare: "HTTP/3 Performance Analysis" (blog.cloudflare.com, декабрь 2024) — 67% случаев HTTP/2 быстрее
  • Chrome team: "QUIC at scale" — проблемы с UDP на enterprise сетях
  • ACM SIGCOMM paper: "Performance implications of HTTP/3" — детальный анализ tradeoffs

Документация которую надо было прочитать:

  • RFC 9000 (QUIC Protocol) — 200 страниц, но вы осилили только заголовок
  • NGINX HTTP/3 guide — там написано что не поддерживается, но вы не читали
  • AWS ALB limitations — там чёрным по белому написано про UDP, но вы не читали

Мониторинг который надо было настроить:

  • Prometheus + qlog exporter — для метрик QUIC
  • OpenTelemetry QUIC tracing — для distributed tracing
  • Real User Monitoring с поддержкой HTTP/3 — чтобы видеть реальный UX

Но вы не читали. Не настроили. Не проверили.

Зато внедрили.