From 42c511a71ea532959d0350cfb2e390a6fcd5a452 Mon Sep 17 00:00:00 2001 From: Ha1zyy Date: Sat, 6 Jun 2026 17:00:03 +0500 Subject: [PATCH] docs(bot): define circuit breaker policy --- docs/architecture/RETRY_STRATEGY.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/architecture/RETRY_STRATEGY.md b/docs/architecture/RETRY_STRATEGY.md index 98cfb6b..f9f7e1c 100644 --- a/docs/architecture/RETRY_STRATEGY.md +++ b/docs/architecture/RETRY_STRATEGY.md @@ -29,6 +29,34 @@ Retry безопасен только если действие idempotent. повторная попытка не должна создать второй платеж, вторую бронь или второй опасный эффект. +Circuit breaker + +Retry не должен бесконечно давить на уже упавший сервис. Для межсервисных HTTP +вызовов нужен circuit breaker: + +- `closed` — запросы идут как обычно; +- `open` — после серии ошибок новые запросы сразу получают fallback; +- `half-open` — после cooldown один пробный запрос проверяет, восстановился ли сервис. + +Первый кандидат — bot-gateway -> payment-service и bot-gateway -> booking-service. +Если payment-service недоступен, gateway должен быстро вернуть понятный fallback +в Telegram, а не держать пользователя до сетевого timeout. + +Целевые настройки для первого PR с кодом: + +- библиотека: `opossum`; +- timeout: 1500 ms; +- error threshold: 50%; +- rolling window: 10 секунд; +- reset timeout: 30 секунд; +- fallback: короткое сообщение пользователю и structured log `circuit.open`. + +Метрики: + +- `metrix_circuit_state{service,target}`; +- `metrix_circuit_open_total{service,target}`; +- `metrix_circuit_fallback_total{service,target}`. + DLQ threshold Если сообщение слишком много раз не обработалось, оно идет в DLQ.