Sobes.tech
Назад к вопросам
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)
}