fix: бесконечное автопереподключение NATS и логирование разрывов

max_reconnect_attempts=-1 (D-6), колбэки disconnected/reconnected/closed,
options типизирован как dict[str, Any].

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-04 02:27:36 +04:00
parent 9cdc62b26d
commit 1b87cd2fdf

View File

@ -8,6 +8,7 @@ middleware (gzip, proxy headers), healthcheck, обработчики исклю
import base64 import base64
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from datetime import UTC, datetime from datetime import UTC, datetime
from typing import Any
import nkeys import nkeys
from fastapi import FastAPI from fastapi import FastAPI
@ -34,7 +35,23 @@ setup_logger(level="DEBUG" if settings.DEBUG else "INFO")
async def _connect_nats() -> NATS | None: async def _connect_nats() -> NATS | None:
"""Подключение к NATS (core, без JetStream); при ошибке — ``None``, приложение всё равно стартует.""" """Подключение к NATS (core, без JetStream); при ошибке — ``None``, приложение всё равно стартует."""
nats_settings = settings.OPENBAO.NATS nats_settings = settings.OPENBAO.NATS
options: dict = {"max_reconnect_attempts": 2}
async def disconnected_cb() -> None:
logger.warning("NATS: соединение потеряно")
async def reconnected_cb() -> None:
logger.info("NATS: соединение восстановлено")
async def closed_cb() -> None:
logger.warning("NATS: соединение закрыто")
# -1 — бесконечное автопереподключение (D-6): иначе клиент закрывается навсегда после короткого сбоя NATS
options: dict[str, Any] = {
"max_reconnect_attempts": -1,
"disconnected_cb": disconnected_cb,
"reconnected_cb": reconnected_cb,
"closed_cb": closed_cb,
}
if nats_settings.NATS_SEED and nats_settings.NATS_JWT: if nats_settings.NATS_SEED and nats_settings.NATS_JWT:
kp = nkeys.from_seed(nats_settings.NATS_SEED.encode("utf-8")) kp = nkeys.from_seed(nats_settings.NATS_SEED.encode("utf-8"))