Choreography has each service react to events and know nothing about the whole; orchestration has one component call the others in order. The first is presented as the enlightened choice and is considerably harder to debug.
// choreography: no component knows the sequence
// OrderPlaced → [payments] → PaymentTaken → [warehouse] → Dispatched
// orchestration: one component does, and can be read
final class PlaceOrderSaga
{
public function run(Order $order): void
{
$this->payments->take($order);
$this->warehouse->reserve($order);
$this->notifications->confirm($order);
}
}
The question worth asking is where the business process lives. If it exists as a described sequence that someone can be wrong about, having it in one readable place is worth the coupling. If each step genuinely stands alone, choreography avoids a component that grows to know everything. Most systems want both, in different places.