Схема уведомлений пользователя в определенное время?
Всем привет.
В проекте необходимо создавать уведомления юзерам по определенному времени (с точностью до минуты).
Некий календарь событий.
Каким образом более рационально спроектировать данную схему?
Решение "в лоб" - с помощью celery оббегать все события каждую минуту и сравнивать их с текущим временем. Но, не совсем правильное и логичное решение.
Какие есть варианты, подскажите?
Заранее благодарю.
Сергей Горностаев, пользователь ставит в своем веб-календаре (alert time). То есть у пользователя есть свой "календарь" на клиенте, куда он вбивает события и ставит время уведомления об этом событии (если необходимо).
Сергей Горностаев, насколько я понимаю, задание будет храниться в памяти? (celery+redis). Насколько надежно данное решение? Плюс, необходимо как-то сохранять уведомление, дабы у юзера была некая "история уведомлений".
mr_drinkens89, задания celery хранятся в базе, так что запланированное никуда не денется. Про redis не могу ничего сказать, использовал всегда rabbitmq, а он гарантирует доставку. Единственное, что может пойти не так - сервисы celery не будут запущены в момент наступление времени задачи.
Сергей Горностаев, насколько я понял из документации, в celery можно выставлять задачи на определенное время. То есть юзер создает событие - выставляет время - вьюшка обрабатывает запрос и ставит в очередь celery task по специфичному времени в будущем.
Далее, в назначенное время срабатывает task и юзеру летит нужное ему уведомление (если он онлайн). Если нет - то уведомление будет у него в истории уведомлений.
mr_drinkens89, в целом правильно, но не знаю, что у вас под "юзеру летит" подразумевается. Если с юзером не удерживается активное websocket-соединение, то в реалтайме он уведомление не получит. Можно организовать механизм доставки сообщений при следующем обновлении страницы: задача celery при срабатывании создаёт запись в базе с сообщением определённому пользователю, а специальный middleware при следующем запросе этого пользователя добавляет ему flash message в ответ. Ну или взять готовый django-stored-messages.
Сергей Горностаев, На клиенте сделано так: настроена центрифуга (centrifugo), которая соединяется с клиентом через сокет. Далее, на бекенде слушаю post_save сигнал от модели Notifications, и рассылаю это в центрифугу. То есть проблем доставки до клиента нет, основная сложность - это "вовремя" сделать эти уведомления, не прибегая к постоянным опросам БД.