@MessagePattern() handles request-response interactions where the return value is sent back to the caller. @EventPattern() handles fire-and-forget events where the return value is discarded. The client uses send() for request-response and emit() for events — both return Observables but with different semantics.
@MessagePattern — use for synchronous query-style operations where the result is needed immediately.
@EventPattern — use for domain events signaling something that happened; no response expected.
send() blocks the caller until a response is received or a timeout occurs.
emit() is non-blocking; the caller continues immediately after the message is sent.
Event-based patterns improve resilience — the emitter is decoupled from all consumers and their availability.