Добавлен лог сессии реализации SSE + Redis для AI Drawer

This commit is contained in:
Fedor
2025-11-11 15:17:06 +03:00
parent 1a4653298d
commit 43e760aad6

View 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**
**Документация обновлена**