Files
crm.clientright.ru/AI_DRAWER_SSE_SESSION_LOG.md

106 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лог сессии: Реализация 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**
**Документация обновлена**