Код-ревью Senior Микросервисы и Spring Cloud обновлено

Код-ревью: клиент сервиса цен

Вопрос

Найдите проблемы устойчивости в интеграции с соседним сервисом.

@Service
public class PricingClient {
    private final RestTemplate rest = new RestTemplate();

    @Retryable(maxAttempts = 10)
    public Price price(String sku) {
        return rest.getForObject("http://10.0.3.17:8080/prices/" + sku, Price.class);
    }

    @Retryable(maxAttempts = 3)
    public void charge(String orderId, BigDecimal amount) {
        rest.postForObject("http://payments/charge", new Charge(orderId, amount), Void.class);
    }

    public List<Price> prices(List<String> skus) {
        List<Price> result = new ArrayList<>();
        for (String sku : skus) {
            result.add(price(sku));
        }
        return result;
    }
}

Коротко

Клиент к соседнему сервису должен быть бином с таймаутами (RestClient с настроенной фабрикой запросов), адресом из конфигурации, ограниченными повторами с backoff и circuit breaker только для идемпотентных операций. Пакетные данные запрашивают одним вызовом.

Что должен найти ревьюер

  1. Ошибкастрока 3
    RestTemplate через new без таймаутов: при зависании соседа потоки будут ждать бесконечно, и мы упадём каскадом.
  2. Производительностьстрока 5
    10 повторов с фиксированной паузой (по умолчанию 1 с) и без circuit breaker: при аварии нагрузка на упавший сервис умножается, ответ клиенту растягивается.
  3. Ошибкастрока 7
    Захардкоженный IP пода: при перезапуске адрес сменится. Нужен адрес Service или обнаружение сервисов, вынесенный в конфигурацию.
  4. Ошибкастрока 10
    Повтор неидемпотентного POST списания: таймаут не значит отказ, повтор спишет деньги дважды. Нужен ключ идемпотентности или отказ от retry.
  5. Ошибкастрока 18
    price(sku) вызывается через this: @Retryable не сработает, а N последовательных HTTP-вызовов в цикле это медленно; нужен пакетный эндпоинт.

Разбор

Клиент к соседнему сервису должен быть бином с таймаутами (RestClient с настроенной фабрикой запросов), адресом из конфигурации, ограниченными повторами с backoff и circuit breaker только для идемпотентных операций. Пакетные данные запрашивают одним вызовом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме