Байты приходят, события нет: проверяем кадры SSE и gzip

opium 46 минут назад Краткое содержание статьи Байты приходят, события нет: проверяем кадры SSE и gzip 4 мин 969 Программирование * Python * Сетевые технологии * Сервер отправляет по SSE три коротких сообщения с паузой...
Will Anthropic have the best AI model at the end of October 2026?
Значимый прорыв формирует отрасль ИИ: opium 46 минут назад Краткое содержание статьи Байты приходят, события нет: проверяем кадры SSE и gzip 4 мин 969 Программирование * Python * Сетевые технологии * Сервер отправляет по SSE три коротких сообщения с паузой в четверть секунды, а обработчик на клиенте срабатывает только в конце: либо три раза подряд, либо один раз со всеми данными сразу. Логи сервера показывают, что каждая запись ушла вовремя. Где задержались данные?
Причин у такого симптома много: прокси, CDN, буфер приложения, медленный клиент. Я разобрал две из них на маленьком стенде, где все остальные слои убраны: незавершённый кадр SSE и gzip без промежуточного сброса. Обе причины описаны в документации.
Технические детали
Задача стенда другая: показать, по каким наблюдениям их можно отличить друг от друга, не гадая. Три точки наблюденияМежду записью на сервере и обработчиком события на клиенте данные проходят три этапа, и на каждом можно поставить отметку времени:Байты тела HTTP. Чтение из сокета вернуло хоть что-то.
Декодированный текст. После распаковки Content-Encoding появились строки data:. Парсер SSE увидел конец блока и отдал событие дальше.
Если задержка возникает между первой и второй точкой, данные застряли в кодеке. Если между второй и третьей, текст пришёл, но парсер ещё не считает событие законченным. СтендОдин скрипт на стандартной библиотеке Python 3.
Отраслевые последствия
1) в контейнере python:3. 0-сервер и клиент работают в одном процессе на 127. 1, без TLS, прокси и браузера.
Сервер пишет три строки data: 0, data: 1, data: 2 с паузой 250 мс, после каждой записи вызывает wfile. Клиент читает тело через HTTPResponse. read1(4096), при необходимости распаковывает и разбирает события.
Каждый режим повторён три раза; ниже медианы, полный вывод с размерами каждого чтения лежит в журнале проверки. Режимы отличаются одним параметром:РежимЧто меняетсяplainпосле каждой строки data: пустая строка, без сжатияmissing_separatorмежду строками data: только один перевод строки; пустая строка дописывается один раз, после третьейgzip_finishкадры правильные, ответ сжат gzip, компрессор сбрасывается только в конце (Z_FINISH)gzip_syncто же сжатие, но после каждого кадра flush(zlib. Z_SYNC_FLUSH)Ядро сервера:for i in range(COUNT): frame = f'data: {i}\n'.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



