Request-response uses @MessagePattern() on the handler and client.send() on the caller — the sender waits for a reply returned as an Observable. Event-based uses @EventPattern() on the handler and client.emit() on the caller — the sender fires and forgets with no reply expected or returned.
@MessagePattern + send() — use when the caller needs data back (query operations, synchronous lookups).
@EventPattern + emit() — use when notifying other services that something happened (domain events).
send() returns an Observable<T> — always convert with firstValueFrom() or lastValueFrom() for async/await code.
emit() also returns an Observable — call .subscribe() to trigger the actual send.
Fire-and-forget decouples services temporally — the emitter does not wait for any consumer to be ready.