Realtime App
WebSocket consumers для real-time функциональности приложения.
Архитектура
UserConsumer (consumers.py)
Универсальный WebSocket consumer, обрабатывающий все real-time события для одного пользователя через одно соединение.
URL: ws://domain/ws/
Функциональность:
- ✅ Чаты и сообщения
- ✅ Реакции на сообщения
- ✅ Индикатор "печатает..."
- ✅ Редактирование/удаление сообщений
- ✅ Уведомления
- ✅ Обновления счетчиков (бейджи)
- 🔄 Онлайн-статус (TODO)
- 🔄 Календарь события (TODO)
Keepalive
- Ping каждые 20 секунд
- Автоматическое переподключение при обрыве
- Nginx таймауты: 7 дней
Подключение
Consumer автоматически подписывается на:
- Группы чатов - все чаты пользователя (
chat_{chat_id}) - Личный канал - для direct updates (
user_{user_id}) - Канал уведомлений - для notifications (
notifications_{user_id})
События от клиента
// Открыть чат
ws.send(JSON.stringify({
action: "open_chat",
chat_id: 123,
load_history: true
}));
// Отправить сообщение
ws.send(JSON.stringify({
action: "send_message",
content: "Hello!"
}));
// Добавить реакцию
ws.send(JSON.stringify({
action: "add_reaction",
message_id: 456,
emoji: "👍"
}));
// Индикатор печати
ws.send(JSON.stringify({
action: "typing"
}));
События к клиенту
// Новое сообщение в активном чате
{
type: "new_message",
chat_id: 123,
message: {...}
}
// Обновление списка чатов
{
type: "list_update",
chat_id: 123,
message: {...}
}
// Реакция добавлена
{
type: "reaction_added",
chat_id: 123,
message_id: 456,
emoji: "👍",
user_id: 10,
user_name: "John Doe"
}
// Уведомление
{
type: "notification",
notification: {...}
}
// Ping для keepalive
{
type: "ping",
timestamp: "2025-12-03T10:00:00Z"
}
Зависимости
communications.models- Chat, Message, MessageReactioncommunications.consumers- serialize_message()notifications.models- для уведомлений (планируется)
Миграция с старой архитектуры
Ранее использовались:
communications/user_consumer.py- чатыnotifications/consumers.py- уведомления
Теперь все в одном месте: realtime/consumers.py
TODO
- Добавить онлайн-статус пользователей
- Интеграция с календарем для real-time событий
- Кэширование статуса "печатает..." через Redis
- Метрики и мониторинг WebSocket соединений