Добавлен лог сессии реализации SSE + Redis для AI Drawer
This commit is contained in:
105
AI_DRAWER_SSE_SESSION_LOG.md
Normal file
105
AI_DRAWER_SSE_SESSION_LOG.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Лог сессии: Реализация 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**
|
||||
✅ **Документация обновлена**
|
||||
|
||||
Reference in New Issue
Block a user