# Лог сессии: Реализация SSE + Redis Pub/Sub для AI Drawer **Дата:** 11 ноября 2025 **Задача:** Переход с polling на real-time коммуникацию через SSE и Redis Pub/Sub ## Проблема Изначально использовался механизм polling: - n8n отправлял ответ в `callback_ai_response.php` - Ответ сохранялся в БД таблицу `ai_responses` - Frontend периодически опрашивал `get_ai_result.php` - Неэффективно и не real-time ## Решение Реализована архитектура на основе: - **Server-Sent Events (SSE)** для real-time доставки ответов - **Redis Pub/Sub** для передачи сообщений от n8n - **Redis кэш** для fallback механизма ## Реализованные компоненты ### 1. SSE Endpoint (`aiassist/ai_sse.php`) - Подписывается на Redis канал `ai:response:{taskId}` - Отправляет события через SSE - Поддерживает plain text и JSON форматы от n8n - Кэширует ответы в Redis для надежности - Логирование в `/logs/ai_sse_debug.log` ### 2. Обновлен `n8n_proxy.php` - Убран callback URL - Добавлена передача Redis параметров в n8n: - `redisChannel` - `redisHost` - `redisPort` - `redisPassword` ### 3. Обновлен `ai-drawer-simple.js` - Заменен `startPolling()` на `startSSEListener()` - Использует `EventSource` API для SSE - Fallback через `checkRedisDirectly()` если SSE не работает - Обработка событий: `connected`, `response`, `error`, `heartbeat` ### 4. Fallback endpoint (`aiassist/check_redis_response.php`) - Прямое чтение из Redis кэша - Используется если SSE не подключился или потерял соединение ## Настройка n8n ### Redis Node Configuration: - **Operation:** Publish - **Channel:** `{{ $json.body.redisChannel }}` или `ai:response:{{ $json.body.taskId }}` - **Data:** `{{ $json.output }}` (можно plain text или JSON) ### Рекомендуется: 1. Сначала выполнить `Redis SET` в ключ `ai:response:cache:{taskId}` (TTL 300 сек) 2. Затем выполнить `Redis PUBLISH` в канал `ai:response:{taskId}` ## Тестирование ### Успешные тесты: - ✅ Получение plain text ответов от n8n - ✅ Кэширование в Redis - ✅ SSE доставка ответов - ✅ Fallback механизм работает ### Логи: - Файл: `/logs/ai_sse_debug.log` - Последние успешные запросы: - `task-691326da57708-1762862810` (15:07:07) - `task-6913281c9ff7e-1762863132` (15:12:36) ## Преимущества новой архитектуры 1. **Real-time:** Ответы приходят мгновенно через SSE 2. **Надежность:** Fallback через Redis кэш 3. **Гибкость:** Поддержка plain text и JSON форматов 4. **Производительность:** Нет постоянного polling 5. **Масштабируемость:** Redis Pub/Sub поддерживает множество подписчиков ## Файлы в репозитории ### Новые файлы: - `aiassist/ai_sse.php` - `aiassist/check_redis_response.php` - `AI_DRAWER_REDIS_SSE.md` - `N8N_REDIS_SETUP.md` - `N8N_REDIS_FIX.md` ### Измененные файлы: - `aiassist/n8n_proxy.php` - `layouts/v7/resources/js/ai-drawer-simple.js` ## Git коммит ``` 1a465329 Реализован SSE + Redis Pub/Sub для AI Drawer ``` ## Статус ✅ **Работает в продакшене** ✅ **Все изменения запушены в Git** ✅ **Документация обновлена**