Alex_Wells
@Alex_Wells
PHP/Kotlin

Почему по дефолту нотификации и броадкаст эвенты попадают в очередь?

Здравствуйте. Пишу проект, использую нотификации и броадкаст эвенты из коробки. Метод send на фасаде нотификаций отправляет нотификацию в очередь, и только sendNow отправляет ее мгновенно. С броадкаст эвентами тоже самое - везде пишут про интерфейс ShouldBroadcast, который отправляет эвент в очередь, и в фреймворке используется именно он, а ShouldBroadcastNow имеет лишь описание в документации в несколько строчек и на этом все.

Сначала я использовал дефолтные варианты с очередями, но позже увидел, что такие это добавляет существенную задержку, даже учитывая мой --sleep=0.05 для нескольких воркеров очередей. Сейчас же использую только отправку sendNow и ShouldBroadcastNow, ибо не вижу причин не делать этого.

Вопрос: почему по дефолту используется именно вариант с очередями, и негласно рекомендуют именно его? Единственное обьяснение, которое я вижу, это то, что такие вещи иногда делаются при обработке HTTP запросов, но даже там я не вижу смысла сокращать время ответа от сервера на 10мс ради того, что бы увеличить нагрузку и задержки. Спрашиваю, потому что если я что-то упускаю, и так делают не просто так, то мне стоит вернуть все как было изначально с очередями.

Заранее спасибо.
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
difiso
@difiso
В параллельной вселенной я космонавт
Отсылка уведомлений, как и широковещательных событий не является частью ответа на запрос клиента. Поэтому их правильнее обрабатывать после отправки ответа клиенту.

Использование очередей при отправке уведомлений (за исключением, быть может, уведомлений, складываемых в БД) оправдано, т.к. уведомления могут быть не только для пользователя, но и для другого микросервиса или продукта. Во время отправки уведомлений сервис (смс-шлюз, рассыльщик почты, api Telegram/Slack etc) может быть недоступен, что приведет к падению по таймауту. В случае ошибки отправки асинхронно воркер сможет повторить попытку, в то время, как ошибка при синхронной отправке отлупит по таймауту еще и клиента, а уведомление не придет т.к. нигде не сохранилось (а асинхронные живут отдельно, в том же редисе или БД), хотя его и ждут.

То же самое касается событий. Клиенту нет необходимости ждать когда вы там свои дела сделаете - отдайте ему ответ и шлите события хоть пачками.

Вопрос здесь не в маниакальном желании отобрать у вас 10 мс жизни, а в принципе разделения ответственности.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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