From 43e760aad609c5ff3f9ecb111112a015d8b44015 Mon Sep 17 00:00:00 2001 From: Fedor Date: Tue, 11 Nov 2025 15:17:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BB=D0=BE=D0=B3=20=D1=81=D0=B5=D1=81=D1=81=D0=B8?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20SSE=20+=20Redis=20=D0=B4=D0=BB=D1=8F=20AI=20Drawer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AI_DRAWER_SSE_SESSION_LOG.md | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 AI_DRAWER_SSE_SESSION_LOG.md diff --git a/AI_DRAWER_SSE_SESSION_LOG.md b/AI_DRAWER_SSE_SESSION_LOG.md new file mode 100644 index 00000000..a3462c9a --- /dev/null +++ b/AI_DRAWER_SSE_SESSION_LOG.md @@ -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** +✅ **Документация обновлена** +