We have traditionally built robust software systems by trying to avoid mistakes and by dodging failures when they occur in production or by testing parts of the system in isolation from one another. Modern methods and techniques take a very different approach based on resiliency, which promotes embracing failure instead of trying to avoid it. Resilient architectures enhance observability, leverage well-known patterns . In this session, will review the most useful patterns for building resilient software systems such as graceful degradation, timeouts and circuit breakers but also new patterns like cell-based architecture and shuffle sharding.