Назад к вопросам
Junior
5
Расскажи про универсальный адаптер для внешних платёжных шлюзов: архитектуру, retry, fallback, circuit breaker, конфигурируемые маппинги.
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
Универсальный адаптер для внешних платёжных шлюзов — это слой абстракции, который позволяет работать с разными платёжными провайдерами через единый интерфейс.
Архитектура:
- Входящий запрос приходит в адаптер с общим форматом.
- Адаптер маппит этот запрос в формат конкретного шлюза (конфигурируемые маппинги).
- Отправляет запрос во внешний шлюз.
- Обрабатывает ответ, преобразуя его обратно в общий формат.
Retry:
- При временных ошибках (например, таймауты, 5xx ошибки) адаптер повторяет запрос с экспоненциальной задержкой.
- Количество попыток и интервалы настраиваются.
Fallback:
- Если основной шлюз недоступен или превышено число повторов, можно переключиться на резервный шлюз.
- Это повышает отказоустойчивость.
Circuit Breaker:
- Механизм, который при частых ошибках «разрывает цепь» и временно блокирует запросы к проблемному шлюзу.
- Позволяет избежать излишней нагрузки и быстро переключиться на fallback.
Конфигурируемые маппинги:
- Позволяют описывать правила преобразования данных (например, поля, форматы дат, валюты) для каждого шлюза в конфигурационных файлах.
- Обеспечивают гибкость и упрощают добавление новых провайдеров без изменения кода.
Пример упрощённой схемы retry с circuit breaker на псевдокоде:
func SendPayment(request PaymentRequest) (PaymentResponse, error) {
if circuitBreaker.IsOpen() {
return fallback.SendPayment(request)
}
for i := 0; i < maxRetries; i++ {
resp, err := gateway.Send(request)
if err == nil {
circuitBreaker.Reset()
return resp, nil
}
circuitBreaker.RecordFailure()
time.Sleep(backoff(i))
}
circuitBreaker.Open()
return fallback.SendPayment(request)
}