@Lepilov

Где хранить идентификатор оповещений(событий) пользователя?

Простая система оповещений пользователя о входящих уведомлениях. Есть булевое значение, в зависимости от значения которого будет выполняться/не выполняться запрос в основную БД по поиску входящий уведомлений. Кроме основной есть еще redis в которой живут сессии пользователя. Поле is_notified есть и в таблице user основной БД и добавляется в сессию пользователя при авторизации.

В проекте используется фреймворк fastAPI, создана middleware которая при каждом запросе будет чекать значение поля is_notified , и если оно в True то идти в БД за сообщениями. Вопрос в какую БД ходить за актуальным статусом правильнее в соответствии с желанием исходить из уменьшения запросов в основную БД но и не нарушать общепринятой архитектуры для таких случаев.

1 вариант - хранение в сессиях
При авторизации пользователя в редисе создается сессия в виде
{'session_id': 
  "session_data": {
    "user_id": 123,
    "is_notified": True,
      ...... 
  }
}


При получении пользователем новых уведомлений is_notified присваивается true. Пользователь заходит на сайт, формируется сессия в которую подтягивается значение is_notified и если оно true то идем в БД за сообщениями.
Но тут проблема. если пользователь онлайн и ему придет уведомление, то нужно изменять значение is_notified в сессии напрямую. Т.е как то делать такую структуру в редисе где для пользователей которые онлайн содержащую матчинг айдишника пользователя и айдишника сессии. По айдишнику сессии вытягивать значение is_notified и менять его.
Это вообще норальный подход?

2 вариант , храним только в основной БД
Тогда миддлваре при каждом запросе будет ходить в БД и чекать значение is_notified. Это лишний запрос в БД при каждом телодвижении пользователя.

Наверняка есть еще варианты. Поделитесь опытом как правильно реализовать?
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 2
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Если "уведомление пользователя", то клиент всегда отсылает "кто он".
На этот флаг можно привязать положить куда хочешь.

Это значит - можно в редис. Можно в мемкэш. Можно в базу. Можешь в сессию.

Быстрей работает мемкеш (оператива работает быстро).
На втором месте редис (тоже оператива, но еще и включенная программа, которая получает запрос).
На третьем файловая система (файловый кеш по ключу notifications.user_id, ssd диск все равно медленнее оперативы)
На четвертом - база (все равно файлы только еще процессинг запроса).

Но вся эта дичь имеет смысл на безумных количествах запросов. Даже для тысяч юзеров в день вообще пофиг.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Не занимайтесь предварительной оптимизацией. Лично я создал бы базовый ответ на каждый запрос, в нем бы были эти нотификации статус и модель ответа. Другой вариант периодический опрос контроллера. И да нужно понимать что запрос по индексируемому полю практически моментален. В общем соберите статистику и подумайте нужно ли вообще это делать
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы