http-webhook-transfer-encoding

<acct-file>

Сжимать ли пачку перед отправкой
в конфигурации это строкаhttp-webhook-transfer-encoding no compressionвнутри блока <acct-file>
Самая дешёвая экономия трафика

Строка включает сжатие содержимого перед отправкой. Поддерживается одно значение — gzip, и по умолчанию сжатия нет.

Записи учёта сжимаются очень хорошо. Это текст с повторяющимися именами полей: NDJSON повторяет их в каждой строке, CSV — в заголовке, но сами значения однотипны. Выигрыш на таком материале обычно кратный.

Приёмник должен уметь разжимать. Заголовок MTA проставит сам, но если принимающая сторона его не смотрит, она получит непонятный двоичный поток. Приёмник, разбирающий тело до ответа, ответит не 2xx — и отправка встанет в повтор; приёмник, отвечающий сразу, примет пачку и потеряет её при разборе.

Это первое, что стоит попробовать при разговоре об объёме — до увеличения интервала и до распараллеливания.

Главная ловушка — включить сжатие, не проверив приёмник. Ошибка выглядит не как ошибка сжатия, а как накопление промежуточных файлов: MTA повторяет, приёмник отказывает, а в журнал по умолчанию попадает лишь краткая запись об ошибке — подробности даёт http-webhook-log-verbose.

Хуже, если приёмник отвечает до разбора тела: он скажет 2xx, повтора не будет, и пачки пропадут молча.

Что делает Хаб. Не пишет — пачки уходят без сжатия.

🔎 А стоило бы попробовать. С каждого узла парка раз в минуту уходят пять видов записей — с полным набором полей по умолчанию и добавками (record-fields d *,timeFirstAttempt,… и так далее). Это самый сжимаемый материал, какой бывает, и сжатие ощутимо сократило бы трафик от узлов к Хабу.

🔴 Но сначала — разжатие в приёмнике. Сейчас его нет, а Laravel тело с Content-Encoding: gzip сам не разжимает. Причём повтора не будет: наш приёмник отвечает 2xx, не заглядывая в тело, фоновый разбор не найдёт в пачке ни одной строки JSON — и записи пропадут, оставив след только в счётчике ошибок приёма телеметрии.

Рекомендуемые значения

Значение одно, вопрос только «включать или нет»:

Значение Когда
не задавать (умолчание) приёмник не умеет разжимать
gzip умеет — тогда всегда

Проверять надо приёмник, а не узел: MTA сжимает и помечает сам.

Единственное поддерживаемое значение и отсутствие сжатия по умолчанию — из руководства (§ 3.3.11.22). Оценка сжимаемости записей учёта и порядок «сначала сжатие, потом всё остальное» — наши.
Пример в конфигурации
# самая дешёвая экономия: включается одной строкой
<acct-file /var/log/pmta/webhook.json>
    http-webhook-url https://hub.example.com/api/telemetry/pmta/7
    http-webhook-transfer-encoding gzip</acct-file>
Перед включением стоит убедиться, что приёмник разжимает: иначе отправка встанет в бесконечный повтор, а пачки будут копиться на узле.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается2 ошибки▶

Включают сжатие, не проверив приёмник

наш опыт

Чем чреватоПриёмник отвечает не 2xx, MTA повторяет бесконечно, промежуточные файлы копятся. Без подробной записи журнал показывает лишь краткую ошибку, и на сжатие думают не сразу.
Как заметитьСразу после правки конфигурации перестают приходить данные, а файлы на узле растут.
Как правильноУбрать строку, проверить приёмник отдельно и включать после.

Пробуют другие способы сжатия

§ 3.3.11.22

Чем чреватоПоддерживается только gzip. Другое значение MTA не примет, и конфигурация не пройдёт проверку.
Как заметитьpmta test config ругается на значение директивы.
Как правильноПисать gzip.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
http-webhook-transfer-encoding <enumeration>
Значения
gzip
Умолчание
no compression § 3.3.11.22
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<acct-file>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Наследования нет: строка живёт внутри своего <acct-file> и действует на его запросы. Один поток учёта может уходить сжатым, другой — нет.
Как проверить на узле
Проверять надо со стороны приёмника — принимает ли он сжатое тело:
curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Encoding: gzip' -H 'Content-Type: application/x-ndjson' --data-binary @batch.json.gz URL
2xx доказывает разжатие только у приёмника, который разбирает тело до ответа. Приёмник, отвечающий сразу и разбирающий в фоне, — как у Хаба, — ответит 2xx и на нечитаемое тело: у такого проверяют результат разбора, а не код. Любой ответ, кроме 2xx, означает, что после включения отправка встанет в повтор.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Собрать телеметрию