Щадящий режим — вторая личность очереди

критично

backoff mode
Не аварийный тормоз, а второй набор настроек

У каждой очереди есть два состояния. В обычном действуют привычные лимиты; в щадящем — их двойники, отдельные директивы с приставкой backoff-. Двойник есть у всего существенного: у темпа писем, объёма данных, темпа подключений, числа соединений и расписания повторов.

Очередь — это пара «приёмник плюс адрес отправки». Режим включается у пары, а не у домена: gmail.com с одного адреса может быть в щадящем режиме, а с другого — в обычном.

Сам собой режим не включается. Вход происходит по совпадению ответа приёмника с образцом из <smtp-pattern-list>, у которого прописано действие mode=backoff. Нет списка образцов — нет и входа: механизм присутствует, но бездействует. Руководство разбирает это на своём примере со списком ошибок AOL.

Что происходит при входе. Всё, что настроено: письмо-уведомление (backoff-notify), другое расписание повторов (backoff-retry-after), сниженный темп (backoff-max-msg-rate) и, если задано, переброс писем на другой адрес отправки (backoff-reroute-to-virtual-mta).

Переброс — самая сильная из этих мер. Письма переезжают в очередь того же приёмника, но другого адреса, и дальше действуют настройки того адреса целиком. Новые письма тоже едут туда, пока исходная очередь в щадящем режиме. Цепочки поддерживаются: один адрес уводит на второй, второй на третий. Петли MTA обнаруживает сам и молча игнорирует переброс.

Выход настраивается отдельно — и по умолчанию не настроен вовсе.

Главная ловушка — вход без выхода. Оба условия возврата выключены по умолчанию: backoff-to-normal-after равен never, backoff-to-normal-after-delivery — false. Очередь, вошедшая в щадящий режим, остаётся в нём бессрочно — до команды pmta set queue –mode=normal, до совпадения образца с mode=normal или до перезапуска MTA. Руководство отдельно предупреждает об этом там, где предлагает включать режим при отключении всех адресов источника: вернувшиеся адреса режим сами не снимут.
Что делает Хаб. Пишет полный набор щадящего режима из пресета узла — четыре строки всегда и три по обстоятельствам. У пресета «Сбалансированный» это:

backoff-max-msg-rate 5/h · backoff-retry-after 1h,3h,6h,12h · backoff-to-normal-after 1h · backoff-to-normal-after-delivery yes; плюс backoff-max-smtp-out 2, backoff-notify и переброс на резервный адрес, когда они заданы. Адресам под прогревом ни одна из этих строк не пишется.

Оба условия возврата включены осознанно — щадящий режим у нас означает «почти остановиться и подождать», а не «замереть навсегда».

Резервный адрес Хаб генерирует сам — отдельным блоком с суффиксом в имени, и переброс на него работает только потому, что SPF домена заранее разрешает все адреса узла. Иначе переброшенные письма ушли бы с адреса, которого нет в записи SPF.

🔴 Что не решено. Внутри узла режимом управляет MTA — он реагирует прямо в соединении. Снаружи тем же занимается планировщик Хаба, но по телеметрии, приходящей секундами и минутами позже. Кто из них главный, когда сработали оба, не определено — это вопрос к устройству продукта, а не к конфигурации.

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

Своих значений у режима нет — их задают директивы-двойники. Важно не то, какие числа выбрать, а то, что каждое из них умалчивает в обычное значение:

Двойник Умолчание Что это значит на деле
backoff-max-msg-rate как обычный темп без своей строки режим не медленнее обычного
backoff-retry-after как обычное расписание повторы не разрежаются
backoff-max-smtp-out 20 соединений столько же, сколько было
backoff-to-normal-after never выхода нет
backoff-to-normal-after-delivery false выхода нет

Отсюда правило: задавать двойники парами с выходом. Набор из одного сниженного темпа без условия возврата — это очередь, которая замедлилась навсегда. Пресеты Хаба ставят оба условия возврата и резко понижают темп: у «Сбалансированного» 5/h против 10/m в обычном режиме.

Щадящий режим — не то же, что режим повторов. Руководство говорит это прямо: очередь, ушедшая в щадящий режим, в режим повторов автоматически не уходит. Если нужно и то и другое, в списке образцов есть отдельное действие defer-queue.

Правило «задавать парами с выходом» и наши числа — из практики Хаба. Из руководства здесь состав двойников, все умолчания, условие входа через список образцов, поведение переброса с обнаружением петель и предупреждение о том, что вернувшиеся адреса режим не снимают.
Пример в конфигурации
# вход — по образцу; выход — двумя условиями; и то и другое обязательно
<smtp-pattern-list block-errors>
    reply /^421 .* too many errors/ mode=backoff</smtp-pattern-list>
<virtual-mta mta-news-1>
    <domain *>
        smtp-pattern-list block-errors
        max-msg-rate 500/h
        backoff-max-msg-rate 1/h
        backoff-to-normal-after 1h
        backoff-to-normal-after-delivery yes
        backoff-reroute-to-virtual-mta mta-news-1-backoff-vmta
    </domain>
</virtual-mta>
Выделенная строка — единственное, что вообще включает режим: без неё все строки ниже останутся мёртвыми. Две строки возврата тоже не формальность: без них очередь останется в щадящем режиме до перезапуска MTA.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Настраивают вход и забывают выход

§ 3.3.10.53

Чем чреватоОба условия возврата выключены по умолчанию. Очередь входит в щадящий режим и остаётся в нём бессрочно — до ручной команды или перезапуска MTA. Приёмник давно перестал отказывать, а отправка к нему идёт по сниженному темпу неделями.
Как заметитьОчередь месяцами показывается в щадящем режиме, отказов от приёмника нет, темп остался пониженным.
Как правильноЗадавать backoff-to-normal-after и backoff-to-normal-after-delivery вместе с любым двойником. Проверять режим очередей в сводке узла, а не только по отказам.

Пишут двойники, не заведя список образцов

§ 11.5.2

Чем чреватоРежим включается только по совпадению ответа приёмника с образцом, несущим действие входа. Без списка образцов ни одна строка с приставкой не сработает никогда — конфигурация выглядит настроенной и не делает ничего.
Как заметитьВ блоке приёмника полный набор двойников, а очередь в щадящем режиме не была ни разу.
Как правильноЗавести <smtp-pattern-list> с ответами приёмника и действием входа, и сослаться на него из блока приёмника строкой smtp-pattern-list.

Оставляют двойник ненастроенным, полагаясь на «щадящесть» режима

§ 3.3.10.41

Чем чреватоКаждый двойник умалчивает в своё обычное значение: темп равен обычному темпу, расписание — обычному расписанию, соединений двадцать. Режим переключается, а поведение не меняется ни в чём — очередь продолжает ломиться к приёмнику ровно тогда, когда он просил сбавить.
Как заметитьОчередь в щадящем режиме, доля отказов та же, темп прежний.
Как правильноЗадавать двойники явно и заметно ниже обычных значений. Сверять пары командой настроек очереди: равенство обычного и щадящего и означает, что своей строки нет.

Перебрасывают очередь на адрес, не настроив его

§ 3.3.10.59

Чем чреватоПосле переброса действуют настройки нового адреса целиком, а не унаследованные от исходного. Адрес-приёмник переброса, у которого нет ни источника, ни ключа подписи, отправит письма не с того IP и без подписи — как раз тогда, когда репутация и так пострадала.
Как заметитьПосле входа очереди в щадящий режим письма уходят с другого IP или приходят неподписанными.
Как правильноНастраивать резервный адрес как полноценный. И помнить о SPF: переброс работает, только если запись домена разрешает все адреса узла.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Наследование
Директивы-двойники живут в блоке приёмника и сливаются по обычному правилу: от общего образца к точному, а по уровням — узел, пул, адрес отправки, и самый узкий сильнее. Сам режим не наследуется: это состояние конкретной очереди, а очередь — пара приёмника и адреса. Переброшенные письма попадают в очередь другого адреса и подчиняются его настройкам целиком, а не унаследованным от исходного.
⇄

Связанные записи

3 связи

Как проверить на узле
Режим очереди виден в сводке, а его настройки — в настройках очереди:
pmta show queues
pmta show settings gmail.com/mta-news-1
pmta set queue --mode=normal gmail.com
Первая печатает очереди с их режимом — веб-монитор умеет отбирать по нему же. Вторая покажет все строки с приставкой backoff и позволит сравнить их с обычными: если совпадают, щадящий режим ничего не изменит. Третья возвращает очередь в обычный режим вручную — та самая команда, которой приходится пользоваться, когда условия выхода не заданы.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Разобраться с доставляемостью · Ротация адресов отправки · Настроить темп под провайдера
Важность
критично