Django, socket.io, node.js - Управление личными сообщениями и групповыми цепочками

Я работаю над созданием back-end для службы, такой как Facebook Messenger или WhatsApp.

Я начал с этого великолепного учебника.

Я делаю это с API, написанным в Python (Django). Наряду с этим API у меня есть процесс Redis и работает сервер node.js (только для localhost). Сервер node.js использует библиотеку socket.io для обмена данными в режиме реального времени через websockets

HTTP-запрос, содержащий сообщение, может быть отправлен с любого клиента в Django API, который, в свою очередь, публикует сообщение Redis на определенном канале.

Сервер node.js подписался на канал Redis и получает уведомление, когда такое сообщение опубликовано. Node отслеживает, какие сокеты, которые в настоящее время связаны с массивом сокетов, с ключем с некоторым идентификатором пользователя.

У меня есть несколько вопросов об этом:

1. Частные сообщения

Я бы хотел отправить сообщение, адресованное определенному пользователю. Мой первоначальный подход заключается в том, чтобы HTTP-запрос (отправленный в Django) включал, какой пользователь должен достигнуть сообщения. Когда это сообщение достигнет сервера node.js(через redis), Node может найти этого пользователя в массиве клиентов. Очевидно, что Django (?) Должен знать, какой сокет socket.io принадлежит тому пользователю. то есть Django должен знать, какой ключ идентификации пользователя должен использовать Node, чтобы захватить правый сокет.

Это хороший подход? Будет ли redis-server быть узким местом, поскольку я использую только один канал публикации? Что произойдет, если целевой пользователь сообщения отключен, когда исходный пользователь отправит сообщение? Я хотел бы захватить это событие и отправить push-уведомление.

2. Номера

Эта услуга не была бы хорошей, если бы не было функций для запуска и ведения групповых разговоров. Из того, что я прочитал, я должен создать socket.io:s комнаты для этого. Тогда мой вопрос: как мне поддерживать комнату между сеансами? Что делать, если каждый пользователь, участвующий в групповом разговоре, переходит в автономный режим и тем самым удаляется из массива node.js server: s. Могу ли я каким-то образом хранить комнаты между сеансами на сервере Django?

Любая помощь и/или отзывы/мысли приветствуются. Благодаря

Ответ 1

  • Личные сообщения

Node отслеживает, какие сокеты, которые в настоящее время связаны с массивом сокетов, с ключем с некоторым идентификатором пользователя.

Ты в значительной степени сказал это там. Django не должен знать идентификатор сокета целевого пользователя, но node.js делает. Если вы хотите отправить сообщение пользователю 3, вы должны отправить сообщение + целевому пользователю (или любым другим метаданным, которые вы хотите) перерисовать. node.js будет искать пользователя, читая элемент с id 3 из массива сокетов и отправляя сообщение этому соединению. Если нет элемента с id = 3, пользователь находится в автономном режиме, и вы можете отправить свое push-уведомление. Eather в node.js или путем уведомления сервера django.

  1. Номер

Поскольку вы хотите, чтобы ваши комнаты были постоянными, вы должны хранить их в какой-то базе данных, такой как mysql или mongodb. Сервер node.js создаст все комнаты, и если пользователь подключится, вы сможете посмотреть, в каких комнатах они участвовали, используя свой идентификатор пользователя. Если они присоединяются к новой комнате, вам необходимо обновить базу данных. Если новая комната создана, node.js необходимо создать комнату socket.io, и база данных также должна быть обновлена.