Задать вопрос
@Webspec

Как ограничить очередь на выполнение только 200 задач в час?

Всем привет!

Сделал отправку E-mail уведомлений пользователей через асинхронное выполнение задач (компонент Message фреймворка).

Почта отправляется через smtp сервер mail.ru, который имеет примерное ограничение на отправку писем в 200 штук в час.

Как мне ограничить выполнение очереди под эти лимиты? Может есть какие-либо настройки под это дело?
  • Вопрос задан
  • 114 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 2
myks92
@myks92
Нашёл решение — пометь вопрос ответом!
Подключите нормальный почтовик без ограничений и не выдумывайте.

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

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

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

Это всё не целесообразные вещи, в которые даже углубляться не надо. Почтовик без лимитов всё решит.
Ответ написан
@Flying
В целом Максим дело говорит, но ситуации бывают разными, поэтому есть вероятность что вам действительно нужно уметь влезать в эти лимиты.

На самом деле, поскольку вы используете Messenger - то вы уже весьма близки к цели, поскольку Messenger перезапускает обработку сообщения в случае неполной обработки. Просто настройте retry_strategy под свои нужды и оно будет работать. Надо только мониторить failed messages.

Также, если вы можете позволить себе использовать Symfony 5.2 - то в этой версии появился отдельный компонент RateLimiter, который специально предназначен для решения именно таких задач. Сделайте Messenger middleware для того чтобы помечать сообщения на отправку только если это разрешает RateLimiter, а для остальных бросайте RecoverableMessageHandlingException чтобы отменить обработку. Но, опять же, не забудьте про настройки retry strategy чтобы это не приводило к потерянным сообщениям.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы