Moving to Cloud NativeBreaking Up the Monolith for the Right ReasonsDecouple Simple Services FirstLearn to Operate on a Small ScaleUse an Anticorruption Layer PatternUse a Strangler PatternCome Up with a Data Migration StrategyRewrite Any Boilerplate CodeReconsider Frameworks, Languages, Data Structures, and DatastoresRetire CodeEnsuring ResiliencyHandle Transient Failures with RetriesUse a Finite Number of RetriesUse Circuit Breakers for Nontransient FailuresGraceful DegradationUse a Bulkhead PatternImplement Health Checks and Readiness ChecksDefine CPU and Memory Limits for Your ContainersImplement Rate Limiting and ThrottlingEnsuring SecurityTreat Security Requirements the Same as Any Other RequirementsIncorporate Security in Your DesignsGrant Least-Privileged AccessUse Separate Accounts/Subscriptions/TenantsSecurely Store All SecretsObfuscate DataEncrypt Data in TransitUse Federated Identity ManagementUse Role-Based Access ControlIsolate Kubernetes PodsWorking with DataUse Managed Databases and Analytics ServicesUse a Datastore That Best Fits Data RequirementsKeep Data in Multiple Regions or ZonesUse Data Partitioning and Replication for ScaleAvoid Overfetching and Chatty I/ODon’t Put Business Logic in the DatabaseTest with Production-like DataHandle Transient FailuresPerformance and ScalabilityDesign Stateless Services That Scale OutUse Platform Autoscaling FeaturesUse CachingUse Partitioning to Scale Beyond Service LimitsFunctionsWrite Single-Purpose FunctionsDon’t Chain FunctionsKeep Functions Light and SimpleMake Functions StatelessSeparate Function Entry Point from the Function LogicAvoid Long-Running FunctionsUse Queues for Cross-Function CommunicationOperationsDeployments and Releases Are Separate ActivitiesKeep Deployments SmallCI/CD Definition Lives with the ComponentConsistent Application DeploymentUse Zero-Downtime ReleasesDon’t Modify Deployed InfrastructureUse Containerized BuildDescribe Infrastructure Using CodeUse Namespaces to Organize Services in KubernetesIsolate the EnvironmentsSeparate Function Source CodeCorrelate Deployments with CommitsLogging, Monitoring, and AlertingUse a Unified Logging SystemUse Correlation IDsInclude Context with Log EntriesCommon and Structured Logging FormatTag Your Metrics AppropriatelyAvoid Alert FatigueDefine and Alert on Key Performance IndicatorsContinuous Testing in ProductionStart with Basic MetricsService CommunicationDesign for Backward and Forward CompatibilityDefine Service Contracts That Do Not Leak Internal DetailsPrefer Asynchronous CommunicationUse Efficient Serialization TechniquesUse Queues or Streams to Handle Heavy Loads and Traffic SpikesBatch Requests for EfficiencySplit Up Large MessagesContainersStore Images in a Trusted RegistryUtilize the Docker Build CacheDon’t Run Containers in Privileged ModeUse Explicit Container Image TagsKeep Container Images SmallRun One Application per ContainerUse Verified Images from Trusted RepositoriesUse Vulnerability Scanning Tools on ImagesDon’t Store Data in ContainersNever Store Secrets or Configuration Inside an ImageSummary