- Создано новое Django приложение realtime
- UserConsumer перенесен из communications в realtime
- Объединена функциональность чатов и уведомлений в одном consumer
- Обновлен asgi.py для использования realtime.routing
- Добавлена подписка на канал уведомлений (notifications_{user_id})
- Ping interval изменен на 20 секунд для лучшего keepalive
- Создан README.md с документацией по архитектуре
Улучшения архитектуры:
- Separation of Concerns: WebSocket логика отделена от бизнес-логики
- Single Responsibility: realtime отвечает только за real-time
- Расширяемость: легко добавлять новые real-time фичи
- Одно WebSocket соединение вместо двух (чаты + уведомления)
125 lines
3.3 KiB
Markdown
125 lines
3.3 KiB
Markdown
# 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 автоматически подписывается на:
|
||
1. **Группы чатов** - все чаты пользователя (`chat_{chat_id}`)
|
||
2. **Личный канал** - для direct updates (`user_{user_id}`)
|
||
3. **Канал уведомлений** - для notifications (`notifications_{user_id}`)
|
||
|
||
## События от клиента
|
||
|
||
```javascript
|
||
// Открыть чат
|
||
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"
|
||
}));
|
||
```
|
||
|
||
## События к клиенту
|
||
|
||
```javascript
|
||
// Новое сообщение в активном чате
|
||
{
|
||
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, MessageReaction
|
||
- `communications.consumers` - serialize_message()
|
||
- `notifications.models` - для уведомлений (планируется)
|
||
|
||
## Миграция с старой архитектуры
|
||
|
||
Ранее использовались:
|
||
- `communications/user_consumer.py` - чаты
|
||
- `notifications/consumers.py` - уведомления
|
||
|
||
Теперь все в одном месте: `realtime/consumers.py`
|
||
|
||
## TODO
|
||
|
||
- [ ] Добавить онлайн-статус пользователей
|
||
- [ ] Интеграция с календарем для real-time событий
|
||
- [ ] Кэширование статуса "печатает..." через Redis
|
||
- [ ] Метрики и мониторинг WebSocket соединений
|