- Добавлен 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 минут)
5.1 KiB
5.1 KiB
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 соединением
🔧 Как работает
Отправка запроса:
// Пользователь отправляет сообщение
sendToN8N(message) → получает task_id → startSSEListener(task_id)
Получение ответа:
// 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 не работает (старые браузеры, проблемы с сетью):
- Через 5 секунд автоматически переключается на polling
- Использует старый метод
startPollingFallback() - Проверяет БД каждые 2 секунды
⚙️ Настройки Redis
- Host:
crm.clientright.ru - Port:
6379 - Password:
CRM_Redis_Pass_2025_Secure! - Канал:
ai:response:{task_id}
🧪 Тестирование
- Откройте AI Drawer в CRM
- Отправьте сообщение
- Проверьте консоль браузера:
AI Drawer: SSE connection openedAI Drawer: Received response via SSE
- Ответ должен прийти мгновенно после обработки n8n
📊 Преимущества
| Параметр | Polling (старое) | Redis Pub/Sub (новое) |
|---|---|---|
| Скорость | До 2 сек задержки | Мгновенно ⚡ |
| Запросы | Каждые 2 сек | Одно соединение |
| Нагрузка | Высокая | Низкая |
| Надежность | ✅ | ✅ + fallback |
🔍 Отладка
Проверить Redis публикацию:
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:
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 секунды!