Realtime и события
WebSocket-стриминг ответов ассистента и событийная модель платформы.
Платформа событийная в двух местах: стриминг ответов чата (WebSocket, пользователь видит токены сразу) и фоновая обработка документов (очередь Asynq между серверами).
Стриминг ответа ассистента
Ответ нейросети идёт токенами через всю цепочку без буферизации:
- Go регистрирует активную WebSocket-сессию в Redis.
- Nginx на маршрутах ассистента работает без буферизации
(
proxy_buffering off) и с заголовками WebSocket-upgrade. context.Contextпробрасывается насквозь: школьник закрыл вкладку — отмена доходит до vLLM, GPU освобождается.
События стрима
Типичный обмен по WebSocket — от вопроса до завершения генерации:
{ "text": "Какие профессии связаны с морем в нашем регионе?" }{ "type": "token", "data": "Судово" }{ "type": "token", "data": "ждение — " }{ "type": "done", "data": { "message_id": "msg_7f3a…" } }Если генерация оборвалась (vLLM недоступен, таймаут), вместо done придёт
error:
{ "type": "error", "data": { "code": "upstream_unavailable" } }| Событие | Когда | Реакция клиента |
|---|---|---|
token | Каждая порция текста | Дописать в сообщение |
done | Генерация завершена | Зафиксировать сообщение, разблокировать ввод |
error | Обрыв или отказ | Показать ошибку, предложить повтор |
При кэш-попадании Redis события те же — клиент не отличает кэшированный ответ от живой генерации.
Событийная очередь: ingest документов
Загрузка документа в базу знаний не блокирует запрос — это событие в очереди Asynq поверх Redis.
- Producer — Go на WEB PORTAL; consumer — ingest worker на NEURO CORE. Брокер один: Redis на WEB PORTAL.
- Payload события — ссылка на файл и метаданные, не сам файл:
{ "doc_id": "course-01", "path": "/private_knowledge/course-01.pdf", "format": "pdf" }- Повторы, backoff и dead queue — штатные механизмы Asynq.
- Запасной путь: файл положили в
private_knowledgeвручную → watcher ставит ту же задачу. Один обработчик на оба пути.
Обработка события описана в RAG-пайплайне.
Что не событийное
Обычные запросы (курсы, опросы, аналитика) — синхронный REST
/api/v1. События применяются там, где есть поток или
долгая фоновая работа, а не везде подряд.