Использовали ли вы шину данных (message bus) на последнем проекте?

«Использовали ли вы шину данных (message bus) на последнем проекте?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да. В микросервисной архитектуре проекта мы использовали Apache Kafka в качестве шины событий для асинхронного и отказоустойчивого обмена сообщениями.

Зачем это было нужно?

  • Снижение связности: Сервисы общались через события, а не через прямые HTTP-вызовы.
  • Масштабируемость: Позволяло независимо масштабировать производителей (producers) и потребителей (consumers) событий.
  • Надежность: Kafka гарантирует сохранение и доставку сообщений.

Практический пример (Spring Boot + Kafka):

// Producer: Сервис заказов публикует событие
@Service
public class OrderService {
    @Autowired
    private KafkaTemplate<String, OrderCreatedEvent> kafkaTemplate;

    public void createOrder(Order order) {
        // ... бизнес-логика
        OrderCreatedEvent event = new OrderCreatedEvent(order.getId());
        kafkaTemplate.send("order-events", event); // Отправка в топик
    }
}

// Consumer: Сервис нотификаций подписан на события
@Service
public class NotificationService {
    @KafkaListener(topics = "order-events")
    public void handleOrderEvent(OrderCreatedEvent event) {
        // Асинхронная обработка: отправка email клиенту
        emailService.sendOrderConfirmation(event.getOrderId());
    }
}

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