Код-ревью 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 только для идемпотентных операций. Пакетные данные запрашивают одним вызовом.
Что должен найти ревьюер
- Ошибкастрока 3RestTemplate через new без таймаутов: при зависании соседа потоки будут ждать бесконечно, и мы упадём каскадом.
- Производительностьстрока 510 повторов с фиксированной паузой (по умолчанию 1 с) и без circuit breaker: при аварии нагрузка на упавший сервис умножается, ответ клиенту растягивается.
- Ошибкастрока 7Захардкоженный IP пода: при перезапуске адрес сменится. Нужен адрес Service или обнаружение сервисов, вынесенный в конфигурацию.
- Ошибкастрока 10Повтор неидемпотентного POST списания: таймаут не значит отказ, повтор спишет деньги дважды. Нужен ключ идемпотентности или отказ от retry.
- Ошибкастрока 18price(sku) вызывается через this: @Retryable не сработает, а N последовательных HTTP-вызовов в цикле это медленно; нужен пакетный эндпоинт.
Разбор
Клиент к соседнему сервису должен быть бином с таймаутами (RestClient с настроенной фабрикой запросов), адресом из конфигурации, ограниченными повторами с backoff и circuit breaker только для идемпотентных операций. Пакетные данные запрашивают одним вызовом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.