@twopizza

Как организовать работу оповещений на сервисе?

Есть необходимость в зависимости от состояний объектов отсылать пользователю оповещения.
Сейчас есть cron скрипт, который проверяет состояния объектов и отсылает нужные оповещения. При этом после отправки он устанавливает флаг у объекта, что оповещение данного типа отправлено. Думаю это не очень красиво. Как можно решить задачу иначе? Может есть какой-то паттерн? На ум приходит только создание отдельной общей таблицы со всеми уведомлениями или отдельной под каждую сущьность.
  • Вопрос задан
  • 300 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Думаю это не очень красиво.


1) при изменении состояния объекта кидайте ивент об этом или явно вызывайте нотификатор
2) нотификатор добавляет в очередь задачу (beanstalkd, rabbitmq, etc)
3) очередь ответственна за отслеживание статуса задачи
4) воркеры берут задачи из очереди и собственно занимаются отправкой.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Это триггер состояний.
Сущности: оповещение, канал (оповещения), статус доставки, статус обработки, время повторного действия, кол-во повторов
По триггеру создаётся экземпляр сущности "оповещение" и присваивается "канал".
Далее, канальный воркер (каждый воркер для своего канала и они синхронны):
1. забирает пакет оповещений длиной N-штук и проставляет статус: sending
2. пытается отправить.
3. когда всё обработано - проставляет статус обработки, согласно обработке (success,fail,retry + sendAt:timestamp + retryCount++ - сам добавляет в очередь)
4. Когда все отправлено - переходит к выборке следующего пакета данных.
Если есть возможность проверки доставки - поле изменяется с помощью входящего события о доставке (за это отвечает протокол канала доставки).
5. После успешной обработки оповещения (статусы все success), можно или просто "убить" оповещение из очереди или поместить в архивную таблицу оповещений (если этого требует бизнес-процесс).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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