Appearance
NATS Bridge
Назначение
Сервис-мост (bridge) между шиной событий NATS и сервером real-time доставки Centrifugo. Подписывается на NATS subjects платформы, оборачивает события в标准化 EventEnvelope и публикует в Centrifugo через HTTP API.
Порты
Нет HTTP-портов — чистый consumer/subscriber.
Архитектура потока данных
Бэкенд-сервисы → NATS subject → Bridge (валидация JSON → EventEnvelope) → HTTP POST → Centrifugo /api/publish → WebSocket → КлиентыКлючевые возможности
- Подписка на NATS subjects с поддержкой wildcards (
pipeline.test.>) - Автоматическая обёртка событий в EventEnvelope (UUID, type, data, timestamp)
- Умная маршрутизация:
user_id→ персональный канал, безuser_id→ broadcast - Ретрай подключения к NATS (10 попыток, 5с интервал)
- Экспоненциальный бэк옩 для runtime reconnect (1s → 30s)
- Graceful shutdown (SIGINT/SIGTERM → drain NATS)
- Валидация JSON — отбрасывает невалидные сообщения
Маппинг subjects → channels
| NATS Subject | Namespace | Канал |
|---|---|---|
job.created | job | job:user:<id> / job:broadcast |
job.changed | job | job:user:<id> / job:broadcast |
executor.status | executor | executor:user:<id> / executor:broadcast |
runner.change | executor | executor:user:<id> / executor:broadcast |
pipeline.test.> | pipeline | pipeline:user:<id> / pipeline:broadcast |
EventEnvelope
json
{
"id": "<UUID v4>",
"type": "<NATS subject>",
"data": { ... },
"timestamp": "<RFC 3339 UTC>"
}Исходящий вызов Centrifugo
POST {CENTRIFUGO_API_URL}/api/publish
Headers: X-API-Key: {CENTRIFUGO_API_KEY}, Content-Type: application/json
Body: {"channel": "<channel>", "data": <envelope_json>}Конфигурация
| Переменная | По умолчанию | Описание |
|---|---|---|
MESSAGING_URL | nats://localhost:4222 | URL NATS-сервера |
CENTRIFUGO_API_URL | http://localhost:8100 | URL HTTP API Centrifugo |
CENTRIFUGO_API_KEY | "" | API ключ Centrifugo |
Исходные файлы
| Файл | Назначение |
|---|---|
cmd/server/main.go | Точка входа: конфиг, подключение NATS, bridge, graceful shutdown |
internal/config/config.go | Загрузка конфигурации из env |
internal/bridge/bridge.go | Основная логика: подписка, обработка, публикация |
internal/bridge/models.go | Модели: EventEnvelope, SubjectMapping, DefaultMappings() |
internal/bridge/envelope.go | Создание EventEnvelope |
internal/bridge/routing.go | Маршрутизация: ResolveChannel() |