4.0 KiB
4.0 KiB
Лог сессии: Реализация 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:
redisChannelredisHostredisPortredisPassword
3. Обновлен ai-drawer-simple.js
- Заменен
startPolling()наstartSSEListener() - Использует
EventSourceAPI для 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)
Рекомендуется:
- Сначала выполнить
Redis SETв ключai:response:cache:{taskId}(TTL 300 сек) - Затем выполнить
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)
Преимущества новой архитектуры
- Real-time: Ответы приходят мгновенно через SSE
- Надежность: Fallback через Redis кэш
- Гибкость: Поддержка plain text и JSON форматов
- Производительность: Нет постоянного polling
- Масштабируемость: Redis Pub/Sub поддерживает множество подписчиков
Файлы в репозитории
Новые файлы:
aiassist/ai_sse.phpaiassist/check_redis_response.phpAI_DRAWER_REDIS_SSE.mdN8N_REDIS_SETUP.mdN8N_REDIS_FIX.md
Измененные файлы:
aiassist/n8n_proxy.phplayouts/v7/resources/js/ai-drawer-simple.js
Git коммит
1a465329 Реализован SSE + Redis Pub/Sub для AI Drawer
Статус
✅ Работает в продакшене
✅ Все изменения запушены в Git
✅ Документация обновлена