Добрый вечер.
Разрабатываю что-то типо системы уведомлений. Фронт React+Redux, бэк Python/+-Rust, есть некоторый опыт с кафкой.
Нарисовал в голове примерно такой сценарий: при входе пользователя на сайт открывается вебсокет, по которому к нему приходят уведомления за время его отсутствия в формате, например, "ещё можно сделать", "нужно сделать сейчас", "пропустил" - это распределяется при подключении в выборке из очереди уведомлений. Далее посетитель должен получать постоянные уведомления, связанные с его группой/организацией/сущностями/индивидуальными настройками, хз, вход с телефона мб или ещё что-то. Вопрос: как такое строится и управляется?
Я думал над чем-то типа того, что после подключения к вебсокету мы должны забрать из некоторой "очереди" то, что застоялось, а потом перейти к обработке потоковой информации. К тому же должен быть кто-то, кто очередь наполняет, либо это просто данные из базы. Думалось, что должен быть один продьюсер, который просыпается раз в N времени, делает запросы в базу, считает время до некоторых событий и дальше уже через, например, кафку, рассылает эти события по каналам тем, кто с ними связан. ( а ещё можно высчитывать точное время до следующего возможного события и спать ровно до него, но тогда мы не будем попадать в обновления или создания новых сущностей, либо должна быть возможность "разбудить" продьюсера, либо отправить сообщение прямо оттуда, где создаётся тем, для кого создаётся) То есть условно
someting = await database.select(SomeThing).where(SomeThing.dt.date() == datetme.today()).all()
for some in something:
producer.send(f"{some.org}.{some.group}", body={"data": some})
# то есть фетчим из базы, решаем что делать, рассылаем кому надо
и
consumer = Consumer(topics=["someorg.team", "someorg.some_group"]) # индивидуальные подписки каждого юзера
async for msg in consumer:
# обработать сообщение отправить в вебсокет уведомление
Но тогда вопрос, а как рассылать индивидуальные уведомления? Например, если назначена встреча или какое-то событие, условно напоминалка стоит. Создавать топик, потом стирать? Системам MQ не понравится такое обращение, думаю. Или держать постоянный топик на каждого юзера системы о_о (например, если вдруг личное сообщение пришло)... Тогда как проще?
В общем, вопрос состоит в том, как и из чего такую систему надо делать, правильный ли ход мысли.