k732gram

#
python
django
centrifugo
docker
docker-compose
pug
stylus

Внутренний мессенджер на Django. Из интересных фишек: для сообщения в конференции виден список прочитавших. Сделано по запросу, иначе бы я не стал подобное творить на django. Впрочем, довольно неплохо работает благодаря Centrifugo.

Интерфейс k732gram
Интерфейс k732gram

Как устроено

Django сам по себе заточен под запросно-ответную архитектуру, и рассылка сообщений в нее не укладывается. Но задача была сделать на Django, для дальнейшей интеграции с другими внутренними сервисами, так что пришлось искать выход в виде Centrifugo. Фактически, это pub/sub сервер с поддержкой websocket-соединений, контролем доступа к топикам по JWT-токенам и простым api. В принципе, там куда больше фишек, но я перечислил именно задейстованные в данном конкретном случае.

Схема рассылки мгновенных сообщений
Схема рассылки мгновенных сообщений

При заходе пользователя в чат, сервер проверяет его права, и при наличии таковых выдает ему JWT-токен с правами на подписку на соответствующий чату pub/sub топик. При поступлении сообщения от пользователя, бэкэнд сохраняет его в базу данных и отправляет событие нового сообщения на сервер Centrifugo, который затем рассылает его всем подписанным клиентам.