Create an HTTP-facing NestJS application that injects multiple ClientProxy instances — one per downstream service. Use sequential calls when each step depends on the previous result. Use Promise.all() for independent parallel calls. Map RpcException errors to appropriate HTTP exceptions using catchError() in the pipeline.
Use Promise.all() for independent downstream calls — runs them in parallel and halves latency.
Use sequential awaits only when each call depends on the result of the previous one.
Apply a global RpcExceptionFilter to convert microservice errors to HTTP responses on the gateway.
Add timeout operators (timeout(3000)) to prevent a slow service from hanging the gateway response.
The gateway should be thin — business logic belongs in the downstream services, not the gateway.