Architecting for Reliable Scalability
AWS Architecture BlogArchitecting for Reliable Scalabilityby Marwan Al Shawi | on03 NOV 2020| inAmazon CloudFront,Amazon EC2,Amazon VPC,Architecture,Auto Scaling,Elastic Load Balancing,Serverless|Permalink|ShareCloud solutions architects should ideally “build today with tomorrow in mind,” meaning their solutions need to cater to current scale requirements as well as the anticipated growth of the solution. This growth can be either the organic growth of a solution or it could be related to a merger and acquisition type of scenario, where its size is increased dramatically within a short period of time.Still, when a solution scales, many architects experience added complexity to the overall architecture in terms of its manageability, performance, security, etc. By architecting your solution or application to scale reliably, you can avoid the introduction of additional complexity, degraded performance, or reduced security as a result of scaling.Generally, a solution or service’s reliability is influenced by its up time, performance, security, manageability, etc. In order to achieve reliability in the context of scale, take into consideration the following primary design principals.ModularityModularity aims to break a complex component or solution into smaller parts that are less complicated and easier to scale, secure, and manage.Figure 1: Monolithic architecture vs. modular architectureModular design is commonly used in modern application developments. where an application’s software is constructed of multiple and loosely coupled building blocks (functions). These functions collectively integrate through pre-defined common interfaces or APIs to form the desired application functionality (commonly referred to as microservices architecture).Figure 2: Scalable modular applicationsFor more details about building highly scalable and reliable workloads using a microservices architecture, refer toDesign Your Workload Service Architecture.This design principle can also be applied to different components of the solution’s architecture. For example, when building a cloud solution on a singleAmazon VPC, it may reach certain scaling limits and make it harder to introduce changes at scale due to the higher level of dependencies. This single complex VPC can be divided into multiple smaller and simpler VPCs. The architecture based on multiple VPCs can vary. For example, the VPCs can be divided based on a service or application building block, a specific function of the application, or on organizational functions like a VPC for various departments. This principle can also be leveraged at a regional level for very high scale global architectures. You can make the architecture modular at a global level by distributing the multiple VPCs across different AWS Regions to achieve global scale (facilitated byAWS Global Infrastructure).In addition, modularity promotes separation of concerns by having well-defined boundaries among the different components of the architecture. As a result, each component can be managed, secured, and scaled independently. Also, it helps you avoid what is commonly known as “fate sharing,” where a vertically scaled server hosts a monolithic application, and any failure to this server will impact the entire application.Horizontal scalingHorizontal scaling, commonly referred to as scale-out, is the capability to automatically add systems/instances in a distributed manner in order to handle an increase in load. Examples of this increase in load could be the increase of number of sessions to a web application. With horizontal scaling, the load is distributed across multiple instances. By distributing these instances acrossAvailability Zones, horizontal scaling not only increases performance, but alsoimproves the overall reliability.In order for the application to work seamlessly in a scale-out distributed manner, the application needs to be designed to support a stateless scaling model, where the application’s state information is stored and requested independently from the application’s instances. This makes the on-demand horizontal scaling easier to achieve and manage.This principle can be complemented with a modularity design principle, in which the scaling model can be applied to certain component(s) or microservice(s) of the application stack. For example, only scale-outAmazon Elastic Cloud Compute(EC2) front-end web instances that reside behind anElastic Load Balancing(ELB) layer with auto-scaling groups. In contrast, this elastic horizontal scalability might be very difficult to achieve for a monolithic type of application.Leverage the content delivery networkLeveragingAmazon CloudFrontand its edge locations as part of the solution architecture can enable your application or service to scale rapidly and reliably at a global level, without adding any complexity to the solution. The integration of a CDN can take different forms depending on the solutionuse case.For example, CloudFront played an important role to enable the scale required throughoutAmazon Prime Day 2020by serving up web and streamed content to a worldwide audience, which handled over 280 million HTTP requests per minute.Go serverless where possibleAs discussed earlier in this post, modular architectures based on microservices reduce the complexity of the individual component or microservice. At scale it may introduce a different type of complexity related to the number of these independent components (microservices). This is whereserverlessservices can help to reduce such complexity reliably and at scale. With this design model you no longer have to provision, manually scale, maintain servers, operating systems, or runtimes to run your applications.For example, you may consider using a microservices architecture to modernize an application at the same time to simplify the architecture at scale usingAmazon Elastic Kubernetes Service(EKS) withAWS Fargate.Figure 3: Example of a serverless microservices architectureIn addition, an event-driven serverless capability likeAWS Lambdais key in today’s modern scalable cloud solutions, as it handles running and scaling your code reliably and efficiently. SeeHow to Design Your Serverless Apps for Massive Scaleand10 Things Serverless Architects Should Knowfor more information.Secure by designTo avoid any major changes at a later stage to accommodate security requirements, it’s essential that security is taken into consideration as part of the initial solution design. For example, if the cloud project is new or small, and you don’t consider security properly at the initial stages, once the solution starts to scale, redesigning the entire cloud project from scratch to accommodate security best practices is usually not a simple option, which may lead to consider suboptimal security solutions that may impact the desired scale to be achieved. By leveraging CDN as part of the solution architecture (as discussed above), using Amazon CloudFront, you can minimize the impact of distributed denial of service (DDoS) attacks as well as perform application layer filtering at the edge. Also, when considering serverless services and theShared Responsibility Model, from a security lens you can delegate a considerable part of the application stack to AWS so that you can focus on building applications. SeeThe Shared Responsibility Model for AWS Lambda.Design with security in mind by incorporating the necessary security services as part of the initial cloud solution. This will allow you to add more security capabilities and features as the solution grows, without the need to make major changes to the design.Design for failureThe reliability of a service or solution in the cloud depends on multiple factors, the primary of which is resiliency. This design principle becomes even more critical at scale because the failure impact magnitude typically will be higher. Therefore, to achieve a reliable scalability, it is essential to design a resilient solution, capable of recovering from infrastructure or service disruptions. This principle involves designing the overall solution in such a way that even if one or more of its components fail, the solution is still be capable of providing an acceptable level of its expected function(s). SeeAWS Well-Architected Framework – Reliability Pillarfor more information.ConclusionDesigning for scale alone is not enough. Reliable scalability should be always the targeted architectural attribute. The design principles discussed in this blog act as the foundational pillars to support it, and ideally should be combined with adopting aDevOps model.TAGS:cloud architecture,design,reliability,Scalability,serverlessMarwan Al ShawiMarwan is an AWS Solutions Architect who has been in the IT industry for more than 15 years. He’s been involved in architecting, designing, and implementing various large-scale IT solutions with different organizations such as Cisco Systems, BT global services, and IBM Australia. Marwan has authored three advanced networking design books as well as several AWS blogs and whitepapers. He holds a Master of Science degree in internetworking from the University of Technology, Sydney.
Cloud solutions architects should ideally “build today with tomorrow in mind,” meaning their solutions need to cater to current scale requirements as well as the anticipated growth of the solution. This growth can be either the organic growth of a solution or it could be related to a merger and acquisition type of scenario, where […]
Marwan Al Shawi
Amazon CloudFront Amazon EC2 Amazon VPC Architecture Auto Scaling Elastic Load Balancing Serverless