Start here. This is the direct spoken answer to practice first.
Overview
Resilience policies are separate controls; stacking defaults without an end-to-end budget can increase latency and amplify an outage.
I start with an end-to-end request deadline and allocate a smaller timeout to the downstream call. I retry only transient failures and only when the operation is safe or protected by idempotency, using a small attempt limit with backoff and jitter. A circuit breaker stops repeated calls while a dependency is failing, and a bulkhead limits how much local capacity that dependency can consume.