Карта / Event-driven / Событие vs команда

Событие vs команда

Команда — «сделай это», адресована конкретному получателю, ожидает выполнения. Событие — «это случилось», объявляется всем, кому интересно, без ожидания конкретной реакции.

// Команда — конкретный адресат, конкретное ожидаемое действие
@PostMapping("/orders/{id}/cancel")
void cancelOrder(Long id) {
    orderService.cancel(id);   // ожидаем, что заказ реально отменится
}

// Событие — просто оповещение, реагировать или нет — решает каждый получатель сам
kafkaTemplate.send("order-events", new OrderCancelledEvent(orderId));
// email-service подписан → отправит письмо
// analytics-service подписан → обновит статистику
// warehouse-service подписан → освободит резерв товара
// а может и никто не подписан — событие просто "ушло в эфир"
Копнуть глубже

Главное архитектурное следствие. Команда жёстко связывает отправителя с конкретным получателем — отправитель явно знает, кому и что он поручает. Событие развязывает их полностью — отправитель публикует факт, происшедший в его собственной зоне ответственности, и не знает (и не должен знать), кто на него подписан и сколько таких подписчиков. Можно добавить нового подписчика на событие OrderCancelled, не трогая код сервиса, который это событие публикует — это и есть слабая связанность (см. тему «GRASP») в действии на уровне сервисов.

Событийное мышление меняет именование. Команды называют в повелительном наклонении (CancelOrder, SendEmail), события — в прошедшем времени (OrderCancelled, EmailSent) — это явный сигнал: команда ещё предстоит выполнить, событие уже свершившийся факт, который нельзя “отменить”, только отреагировать на него.

🎤 Закрыл тему, если можешь объяснить:
• разницу команды и события по адресации и ожиданию;
• почему события снижают связанность между сервисами и как это видно в именовании (если дошёл до 2-го слоя).