Files
crm.clientright.ru/AI_DRAWER_REDIS_SSE.md
Fedor 1a4653298d Реализован SSE + Redis Pub/Sub для AI Drawer
- Добавлен SSE endpoint (aiassist/ai_sse.php) для real-time получения ответов от n8n
- Обновлен n8n_proxy.php: убран callback, добавлена передача Redis параметров в n8n
- Обновлен ai-drawer-simple.js: переход с polling на SSE с fallback через Redis
- Добавлен check_redis_response.php для прямого чтения из Redis кэша
- Добавлена документация: N8N_REDIS_SETUP.md, N8N_REDIS_FIX.md, AI_DRAWER_REDIS_SSE.md
- Поддержка plain text ответов от n8n (автоматическое определение формата)
- Кэширование ответов в Redis для надежности (TTL 5 минут)
2025-11-11 15:16:27 +03:00

131 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI Drawer: Redis Pub/Sub вместо Polling
## ✅ Что сделано
### Проблема
Раньше использовался polling - браузер каждые 2 секунды спрашивал сервер "готово ли?". Это создавало:
- Лишние запросы к серверу
- Задержку до 2 секунд перед получением ответа
- Нагрузку на БД
- Дублирование истории (БД + n8n)
### Решение
Теперь используется **Redis Pub/Sub + SSE (Server-Sent Events)** с прямой публикацией из n8n:
- ✅ Мгновенная доставка ответов (без задержек)
- ✅ Нет лишних запросов (одно SSE соединение)
- ✅ Меньше нагрузка на сервер
- ✅ Нет дублирования - история только в n8n
- ✅ Упрощенная архитектура - без БД и callback
- ✅ Fallback на polling если SSE не работает
## 📋 Архитектура
```
1. AI Drawer → n8n_proxy.php → возвращает task_id
2. n8n обрабатывает → публикует ответ НАПРЯМУЮ в Redis
3. Redis PUBLISH → канал "ai:response:{task_id}"
4. ai_sse.php → подписан на Redis → отправляет через SSE в браузер
5. Браузер → EventSource → получает ответ мгновенно! ⚡
```
**История диалога:** Сохраняется в n8n автоматически (не дублируется в БД)
## 📁 Измененные файлы
### 1. `/aiassist/ai_sse.php` (новый)
SSE endpoint для подписки на Redis события
### 2. `/aiassist/n8n_proxy.php` (упрощен)
- ❌ Убрано сохранение в БД
- ❌ Убран callback URL
- ✅ Добавлены параметры Redis для n8n
### 3. `/callback_ai_response.php` (больше не используется)
Можно удалить - n8n публикует напрямую в Redis
### 4. `/layouts/v7/resources/js/ai-drawer-simple.js` (обновлен)
- Заменен `startPolling()` на `startSSEListener()`
- Добавлен fallback на polling если SSE не работает
- Добавлено поле `currentEventSource` для управления SSE соединением
## 🔧 Как работает
### Отправка запроса:
```javascript
// Пользователь отправляет сообщение
sendToN8N(message) получает task_id startSSEListener(task_id)
```
### Получение ответа:
```javascript
// SSE соединение открывается один раз
EventSource('/aiassist/ai_sse.php?task_id=123')
// n8n обрабатывает и публикует НАПРЯМУЮ в Redis:
Redis PUBLISH "ai:response:123" {
task_id: "123",
response: "...",
status: "completed"
}
// SSE endpoint получает событие и отправляет в браузер
// Браузер получает ответ мгновенно!
```
### Настройка n8n:
См. подробную инструкцию: `N8N_REDIS_SETUP.md`
## 🛡️ Fallback механизм
Если SSE не работает (старые браузеры, проблемы с сетью):
1. Через 5 секунд автоматически переключается на polling
2. Использует старый метод `startPollingFallback()`
3. Проверяет БД каждые 2 секунды
## ⚙️ Настройки Redis
- **Host**: `crm.clientright.ru`
- **Port**: `6379`
- **Password**: `CRM_Redis_Pass_2025_Secure!`
- **Канал**: `ai:response:{task_id}`
## 🧪 Тестирование
1. Откройте AI Drawer в CRM
2. Отправьте сообщение
3. Проверьте консоль браузера:
- `AI Drawer: SSE connection opened`
- `AI Drawer: Received response via SSE`
4. Ответ должен прийти мгновенно после обработки n8n
## 📊 Преимущества
| Параметр | Polling (старое) | Redis Pub/Sub (новое) |
|----------|------------------|----------------------|
| Скорость | До 2 сек задержки | Мгновенно ⚡ |
| Запросы | Каждые 2 сек | Одно соединение |
| Нагрузка | Высокая | Низкая |
| Надежность | ✅ | ✅ + fallback |
## 🔍 Отладка
### Проверить Redis публикацию:
```bash
redis-cli -h crm.clientright.ru -a 'CRM_Redis_Pass_2025_Secure!' \
PUBLISH "ai:response:test-task" '{"task_id":"test-task","response":"test"}'
```
### Проверить SSE endpoint:
```bash
curl -N "https://crm.clientright.ru/aiassist/ai_sse.php?task_id=test-task"
```
### Логи:
- PHP error_log: `/var/log/php/error.log`
- Ищите: `[AI SSE]` и `[Callback]`
## ✅ Результат
Теперь AI Drawer получает ответы **мгновенно** через Redis Pub/Sub вместо ожидания polling каждые 2 секунды!