Ответ
Задача: Реализовать отказоустойчивый процесс создания заказа в e-commerce-системе, координирующий вызовы нескольких микросервисов.
Контекст: Процесс должен последовательно:
- Проверить наличие товара на складе (Inventory Service).
- Заблокировать сумму на карте клиента (Payment Service).
- Создать запись о заказе (Order Service).
Решение (Схематично на Spring Boot с Resilience4j):
@Service
public class OrderOrchestratorService {
@Autowired
private InventoryClient inventoryClient;
@Autowired
private PaymentClient paymentClient;
@Autowired
private OrderRepository orderRepository;
// Circuit Breaker защищает от сбоев в сторонних сервисах
@CircuitBreaker(name = "orderCreation", fallbackMethod = "createOrderFallback")
// Retry повторяет попытку при временных ошибках (например, таймаут сети)
@Retry(name = "orderCreationRetry")
public Order createOrder(OrderRequest request) {
// 1. Оркестрация: проверка запасов
inventoryClient.reserveItems(request.getItems());
// 2. Оркестрация: обработка платежа
PaymentResponse payment = paymentClient.authorizePayment(request.getPaymentDetails());
// 3. Фиксация результата
Order order = new Order(request, payment.getTransactionId());
return orderRepository.save(order);
}
// Fallback-метод вызывается при открытом Circuit Breaker
private Order createOrderFallback(OrderRequest request, Exception e) {
// Логика компенсации или возврата пользователю понятной ошибки
log.error("Order creation failed for request: " + request, e);
throw new ServiceUnavailableException("Order service is temporarily unavailable. Please try later.");
}
}
Ключевые практики оркестрирования, применённые в решении:
| Практика | Инструмент/Подход | Цель |
|---|---|---|
| Управление ошибками | Circuit Breaker (Resilience4j) | Предотвращение каскадных сбоев и перегрузки упавшего сервиса. |
| Повторные попытки | Retry Pattern (Resilience4j) | Устойчивость к временным сетевым проблемам или высокой нагрузке. |
| Компенсирующие транзакции (Saga) | Fallback-метод и логика отката | Отмена ранее выполненных шагов (например, разблокировка товара) при ошибке на последующих. |
| Трассировка | Sleuth/Zipkin | Мониторинг и отладка потока запроса через несколько сервисов. |
Альтернатива: Для сложных бизнес-процессов вместо прямого оркестрирования кодом можно использовать специализированные инструменты (Camunda, Temporal) или шаблон Saga.