Полезные команды Postfix. Работа с очередью Postfix

Альтернативный вариант — посчитать файлы в соответствующем каталоге:

# find /var/spool/postfix/deferred -type f / wc -l # find /var/spool/postfix/active -type f / wc -l # find /var/spool/postfix/incoming -type f / wc –l

Отправка всех сообщений, находящихся в очереди

# postqueue -f # mailq -q # postsuper -r ALL

Отправка сообщения с конкретным идентификатором

# postqueue -i # postsuper -r

Отправка всех сообщений для конкретного домена

# postqueue -s domain.com

Подсчет кол-ва писем в очереди для/от конкретного адресата

# mailq / grep bob@domain.com / wc –l

Просмотр активных отправителей

# mailq/grep [A-F0-9] /cut -c 42-80/ sort / uniq -c/ sort -n 1 MAILER-DAEMON 1 user1@yahoo.com 33 admin@example.com 1770 no-reply@domain.com

Сортировка почты по домену отправителя

# mailq / egrep ‘w.*d*:d*.*@.*..*’ —color/awk »/cut -d@ -f2/sort/uniq –c

из списка почтовой очереди mailq берем первый попавшийся номер письма от нужного нам домена,с которого идет рассылка большого кол-ва сообщений и определяем имя пользователя, с которого идет рассылка

# postcat -vq BA84A294E693 / less

Просмотреть параметры сообщения и причины проблем с отправкой для заданного идентификатора сообщения в очереди:

# postcat -q BA84A294E693 / less

# postcat -vq BA84A294E693 / less

Очистка почтовой очереди(удаление всех писем с очереди)

# postsuper -d ALL

Очистка почтовой очереди типа deferred

# postsuper -d deferred

Удаление письма с конкретным идентификатором

# postsuper -d ID, где ID – идентификатор письма

Удаление писем из очереди в зависимотси от ошибки

# postqueue -p / grep -B1 ‘rejected: Domain not found’ / grep -vE ‘(—/reject)’ / awk » / postsuper -d — # postqueue -p / grep -B1 ‘Host not found’ / grep -vE ‘(—/()’ / awk » / postsuper -d — # postqueue -p / grep -B1 ‘rejected: User unknown in local recipient table’ / grep -vE ‘(—/()’ / awk » / postsuper -d — # postqueue -p / grep -B1 ‘Could not complete sender verify callout’ / grep -vE ‘(—/()’ / awk » / postsuper -d —

в конце скрипта, можно заменить на

, если хотите сделать массовое удержание или ключик

, если хотите протолкнуть письма в очереди. Все зависит от поставленных задач. Удаление с очереди писем, отправленных с конкретного адреса

# mailq / grep MAILER-DAEMON / awk » / cut -d* -f 1 / xargs -n 1 postsuper -d # mailq / grep bob@domain.com / awk » / xargs -n1 postsuper –d # postqueue -p / grep ‘MAILER-DAEMON’ / awk » / postsuper -d —

Удаление почты для конкретного получателя/отправителя(получатель-поле 8 или отправитель- поле 7)

# mailq / tail -n +2 / grep -v ‘ *(‘ / awk ‘BEGIN < RS = » > < if ($8 == «user@example.com» && $9 == «) print $1 >’ / tr -d ‘*!’ / postsuper -d —

Новости по теме:   Статья 134. Половое сношение и иные действия сексуального характера с лицом, не достигшим шестнадцатилетнего возраста

Постановка письма на «удержание» (перевод в режим hold – postfix не будет пытаться отправить письмо получателю в таком режиме)

# postsuper -h # postsuper -h ALL

– все сообщения перевести в режим hold

# postsuper -h deferred

– все письма с очереди deferred перевести в режим hold Снятие письма с режима «удержание»

# postsuper -H # postsuper -H ALL

– все сообщения перевести с режима hold в режим deferred Просмотр списка писем в очереди по доменам получателя Очередь Active

# qshape T 5 10 20 40 80 160 320 640 1280 1280+ TOTAL 0 0 0 0 0 0 0 0 0 0 0

# qshape deferred T 5 10 20 40 80 160 320 640 1280 1280+ TOTAL 1803 0 0 0 0 0 0 1 0 307 1495 aol.com 343 0 0 0 0 0 0 0 0 50 293 ovi.com 144 0 0 0 0 0 0 0 0 26 118 facebook.com 122 0 0 0 0 0 0 0 0 17 105 yahoo.co 42 0 0 0 0 0 0 0 0 7 35 ……………………………………………………………….

Срок хранения bounce в очереди 1 сутки (максимальное время письма в очереди после которого письмо cчитается недоставленным)( default: 5d)

bounce_queue_lifetime = 3d

Пробовать доставить обычные сообщения в течении трех дней (максимальное время нахождения письма в очереди, после которого отправителю будет отправлен отчет о недоставке) (default: 5d)

maximal_queue_lifetime = 3d

Минимальный интервал повторной отправки сообщений в очереди (минимальное время между попытками доставить письмо) (default: 300s)

minimal_backoff_time = 180s

Максимальный интервал повторной отправки сообщений в очереди (максимальное время между попытками доставить письмо в статусе deferred) (default: 4000s)

maximal_backoff_time = 6h

Период запуска менеджера очереди

к содержанию ↑

Дистанционное обучение в сентябре 2021 г.: вместо “дистанта” появилось “совмещение”

Редакция BUSINESS собрала имеющуюся на данный момент официальную информацию касаемо планов перевода на дистанционное обучение школьников и студентов с 1 сентября 2021 года.

12.08.202170204

Если говорить коротко, то принимать решение о переводе школьников и студентов на дистанционное обучение будут исходя из складывающейся эпидемиологической обстановки ближе к 1 сентября – учебные заведения вправе решать этот вопрос самостоятельно. Однако, 11 августа, появилась информация о введении некого “совмещённого” формата в вузах, и прояснилась стратегия перевода школьников на дистанционку в случае необходимости.

к содержанию ↑

Пустят ли непривитых студентов в общежития

Тут планы руководства вузов расходятся. Где-то говорят, что при заселении в общежитие будут требовать подтверждение вакцинации, справку о перенесённой болезни или отрицательный ПЦР-тест. А в каких-то вузах говорят, что ограничений при заселении в общежития нет.

Рекомендуем узнавать данную информацию в своём учебном заведении заранее.

Уйдут ли школы на дистант с 1 сентября.

Москва и Московская область совершенно точно готовятся к очному формату обучения в школах, докладывая о введении всё новых и новых учебных заведений к 1 сентября.

Мнение эксперта
Рубцов Александр Феликсович

Ученики младших классов, вероятнее всего, начнут учиться очно, а что касается старшеклассников, то власти российских субъектов будут «смотреть по ситуации» и отталкиваться от статистических данных по COVID-19.

По состоянию на 11 августа, официальных заявлений о переводе на дистанционное обучение учеников из старших классов пока не прозвучало.

к содержанию ↑

Почему нужна инструментальная поддержка пагинации на ключах

Всем привет! Я бэкэнд-разработчик, пишу микросервисы на Java + Spring. Работаю в одной из команд разработки внутренних продуктов в компании Тинькофф.

У нас в команде часто встает вопрос оптимизации запросов в СУБД. Всегда хочется еще чуть-чуть быстрее, но не всегда можно обойтись продуманно выстроенными индексами — приходится искать какие-то обходные пути. Во время одного из таких скитаний по сети в поисках разумных оптимизаций при работе с БД я нашел бесконечно полезный блог Маркуса Винанда, автора книги SQL Performance Explained.

Новости по теме:   Ваша заявка уже обрабатывается

Это тот самый редкий вид блогов, в котором можно читать все статьи подряд.

Хочу перевести для вас небольшую статью Маркуса. Ее можно назвать в какой-то степени манифестом, который стремится привлечь внимание к старой, но до сих пор актуальной проблеме производительности операции offset по стандарту SQL.

В некоторых местах я буду дополнять автора пояснениями и замечаниями. Все такие места я буду обозначать как «прим.» для большей ясности

к содержанию ↑

Еще немного боли

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

Когда используется offset для пропуска записей с предыдущих страниц, в ситуации добавления новой записи между операциями чтения разных страниц, вероятнее всего, вы получите дубликаты (прим.: такое возможно, когда мы читаем постранично с использованием конструкции order by, тогда в середину нашей выдачи может попасть новая запись).

Рисунок наглядно изображает такую ситуацию. База читает первые 10 записей, после этого вставляется новая запись, которая смещает все прочитанные записи на 1. Затем база берет новую страницу из 10 следующих записей и начинает не с 11-й, как должна, а с 10-й, дублируя эту запись.

Есть и другие аномалии, связанные с использованием этого выражения, но эта — самая распространенная.

Как мы уже выяснили, это не проблемы конкретной СУБД или их реализаций. Проблема — в определении пагинации по стандарту SQL. Мы говорим СУБД, какую страницу нужно достать или как много записей пропустить.

База просто не в состоянии оптимизировать такой запрос, так как для этого слишком мало информации.

Стоит также уточнить, что это проблема не конкретного ключевого слова, а скорее семантики запроса. Есть еще несколько идентичных по проблемности синтаксисов:

  • Ключевое слово offset, как говорилось ранее.
  • Конструкция из двух ключевых слов limit [offset] (хотя сам по себе limit не так уж и плох).
  • Фильтрация по нижним границам, построенная на нумерации строк (например, row_number(), rownum и т. д.).

Все эти выражения просто говорят, сколько строк нужно пропустить, никакой дополнительной информации или контекста.

Далее в этой статье ключевое слово offset используется как обобщение всех этих вариантов.

к содержанию ↑

Жизнь без OFFSET

А теперь представим, каким был бы наш мир без всех этих проблем. Оказывается, жизнь без offset не так уж и сложна: селектом можно выбирать только те строки, что мы еще не видели (прим.: то есть те, которых не было на прошлой странице), с помощью условия в where.

В этом случае мы отталкиваемся от того факта, что селекты исполняются над упорядоченным множеством (старый добрый order by). Поскольку имеем упорядоченное множество, можем использовать довольно простой фильтр, чтобы доставать только те данные, которые находятся за последней записью предыдущей страницы:

SELECT . FROM . WHERE . AND id < ?last_seen_id ORDER BY id DESC FETCH FIRST 10 ROWS ONLY

Мнение эксперта
Рубцов Александр Феликсович

Вот и весь принцип такого подхода. Конечно, при сортировке по многим столбцам все становится веселее, но идея все та же. Важно заметить, что эта конструкция применима на многих NoSQL-решениях.

Новости по теме:   На моём земельном участке сетевая организация установила электрический столб

Такой подход называется seek method или keyset pagination. Он решает проблему с плавающим результатом (прим.: ситуация с записью между чтениями страниц, описанная ранее) и, конечно, что мы все любим, работает быстрее и стабильнее, чем классический offset. Стабильность заключается в том, что время обработки запроса не увеличивается пропорционально номеру запрашиваемой таблицы (прим.: если хочется подробнее узнать про работу разных подходов к пагинации, можно полистать презентацию автора.

Там же можно найти сравнительные бенчмарки по разным методам).

Один из слайдов рассказывает о том, что пагинация по ключам, конечно же, не всемогущая — она имеет свои ограничения. Наиболее значимое — у нее нет возможности читать случайные страницы (прим.: непоследовательно). Однако в эпоху бесконечного скроллинга (прим.: на фронтэнде) это не такая уж и проблема.

Указание номера страницы для щелчка — в любом случае плохое решение при разработке UI (прим.: мнение автора статьи).

к содержанию ↑

А что с инструментами?

Пагинация на ключах часто не подходит из-за отсутствия инструментальной поддержки данного метода. Большинство из инструментов разработки, в том числе различные фреймворки, не дают выбора, каким именно способом будет выполняться пагинация.

Ситуацию усугубляет то, что описанный метод требует сквозной поддержки в используемых технологиях — начиная от СУБД и заканчивая исполнением AJAX-запроса в браузере при бесконечном скроллинге. Вместо того чтобы указывать только номер страницы, теперь придется указывать набор ключей для всех страниц сразу.

Однако количество фреймворков, поддерживающих пагинацию на ключах, постепенно растет. Вот что есть на данный момент:

  • jOOQ для Java;
  • order_query для Ruby;
  • chunkator и Django Infinite Scroll Pagination для Django;
  • SQL Alchemy sqlakeyset для Python;
  • blaze-persistence — criteria API для реализаций JPA;
  • DBIx::Class::Wrapper для Perl;
  • Massive.js, мапер для Node.js Keyset Documentation.

(Прим.: некоторые ссылки были убраны ввиду того, что на момент перевода некоторые библиотеки не обновлялись с 2017—2018 года. Если интересно, можно заглянуть в первоисточник.)

Как раз на этом моменте и нужна ваша помощь. Если вы разрабатываете или поддерживаете фреймворк, который хоть как-то использует пагинацию, то я прошу, я призываю, я молю вас сделать нативную поддержку для пагинации на ключах. Если есть вопросы или вам нужна помощь, буду раду помочь (форум, Twitter, форма для обращений) (прим.: по моему опыту общения с Маркусом могу сказать, что он действительно относится с энтузиазмом к распространению этой темы).

Если же вы пользуетесь готовыми решениями, которые, как вы думаете, достойны иметь поддержку пагинации по ключам, — создайте реквест или даже предложите готовое решение, если это возможно. Можно также указать в ссылке данную статью.

Следующая
РазноеПромилле в выдыхаемом воздухе: как измерить и что означают результаты

Добавить комментарий