Sobes.tech
Senior
35

/** * == FT == * Η υπηρεσία επεξεργασίας παραγγελιών λαμβάνει μια παραγγελία για επεξεργασία μέσω του REST API. * Η επεξεργασία είναι η εξής: * - Έλεγχος διαθεσιμότητας προϊόντος στο απόθεμα (καλείται εξωτερική υπηρεσία μέσω REST/HTTP). Αν το προϊόν δεν είναι διαθέσιμο, η επεξεργασία της παραγγελίας διακόπτεται. * - Αποθήκευση της παραγγελίας στη βάση δεδομένων παραγγελιών * - Εκκίνηση περαιτέρω επεξεργασίας της παραγγελίας (Processing, καλείται εξωτερική υπηρεσία μέσω REST/HTTP) * - Ενεργοποίηση ειδοποιήσεων για τη νέα παραγγελία (Notification, καλείται εξωτερική υπηρεσία μέσω REST/HTTP) * * == Σημείωση == * - η επεξεργασία πρέπει να είναι τέτοια ώστε, αν η αποθήκευση της παραγγελίας στη βάση δεδομένων αποτύχει, να μην ξεκινά η επεξεργασία (processing) και οι ειδοποιήσεις (notification) * - χρησιμοποιήστε έναν αναγνωριστικό παραγγελίας για τη συσχέτιση των logs * - παρακολουθήστε μετρήσεις: 1) αριθμός αποδεκτών παραγγελιών 2) αριθμός επιτυχώς επεξεργασμένων παραγγελιών * - η υπηρεσία πρέπει να μπορεί να επεξεργάζεται έως και 100 παραγγελίες ανά δευτερόλεπτο */

Εταιρείες όπου ρωτήθηκαν
СБЕРСБЕР

Απάντηση από AI

sobes.tech AI

Для реализации сервиса обработки заказов с указанными требованиями можно использовать следующий подход:

  • Проверка наличия товара: вызвать внешний REST-сервис, если товара нет — прекратить обработку.

  • Сохранение заказа в БД: если сохранение не удалось, не запускать дальнейшую обработку и уведомления.

  • Запуск дальнейшей обработки и уведомлений: вызвать соответствующие REST-сервисы.

  • Корреляция логов: использовать идентификатор заказа как часть контекста логирования (например, через MDC в SLF4J).

  • Метрики: использовать счетчики для количества принятых и успешно обработанных заказов (например, Micrometer).

  • Производительность: обеспечить асинхронную обработку с ограничением до 100 заказов в секунду, например, с помощью пула потоков или реактивного подхода.

Пример упрощённого кода на Java с использованием Spring Boot и RestTemplate:

@Service
public class OrderProcessingService {
    private final RestTemplate restTemplate;
    private final OrderRepository orderRepository;
    private final MeterRegistry meterRegistry;

    private final Counter acceptedOrders;
    private final Counter successfulOrders;

    public OrderProcessingService(RestTemplate restTemplate, OrderRepository orderRepository, MeterRegistry meterRegistry) {
        this.restTemplate = restTemplate;
        this.orderRepository = orderRepository;
        this.meterRegistry = meterRegistry;
        this.acceptedOrders = meterRegistry.counter("orders.accepted");
        this.successfulOrders = meterRegistry.counter("orders.successful");
    }

    public void processOrder(Order order) {
        MDC.put("orderId", order.getId());
        acceptedOrders.increment();

        // Проверка наличия товара
        Boolean inStock = restTemplate.getForObject("http://stock-service/api/stock/{productId}", Boolean.class, order.getProductId());
        if (inStock == null || !inStock) {
            // Товара нет, прекращаем обработку
            MDC.clear();
            return;
        }

        try {
            orderRepository.save(order);
        } catch (Exception e) {
            // Не удалось сохранить заказ, не запускаем processing и notification
            MDC.clear();
            return;
        }

        // Запуск дальнейшей обработки
        restTemplate.postForEntity("http://processing-service/api/process", order, Void.class);

        // Инициирование уведомлений
        restTemplate.postForEntity("http://notification-service/api/notify", order, Void.class);

        successfulOrders.increment();
        MDC.clear();
    }
}

Для обеспечения пропускной способности до 100 заказов в секунду можно использовать:

  • Асинхронную обработку с очередью и пулом потоков.
  • Реактивные библиотеки (Spring WebFlux).
  • Ограничение скорости (rate limiting) на входящих запросах.

Таким образом, сервис будет корректно обрабатывать заказы, вести метрики и логи с корреляцией по идентификатору заказа.