Senior Enterprise Architect
Aug 10, 2023 | 7 mins read
The software development landscape is constantly evolving, driven by cutting-edge technologies, modern architectural design patterns, and the demand for always-on, secure, resilient, and adaptable computing.
Additionally, fundamental shifts in thinking occasionally occur due to the emergence of breakthrough technologies that significantly impact software development direction, such as the development and adoption of cloud-native architecture.
As a result, cloud-native applications are increasing in popularity and are fast becoming a mainstay of our post-modern, global economy. We have moved from the monolithic age to the cloud age into the cloud-native age, where applications are now purpose-built to leverage the benefits of the cloud, including characteristics such as exceptional agility, resiliency, scalability, and elasticity.
To further emphasize this point, it is worth considering the 2022 survey by Cloud Native Computing Foundation headlines with:
“[2022:] The year cloud native became the new normal.”
Additionally, a November 2021 report by Gartner noted the following:
Note: The massive and widespread adoption of the cloud-native model is attributed to the effect the COVID-19 pandemic had on the global economy, making cloud-native the centerpiece of the new digital experience.
When considering this information, the question is how to build scalable and resilient cloud-native applications.
Let’s attempt to provide a cohesive answer by starting with a look at the “what and why” of the cloud-native model.
“The ongoing pandemic and the surge in digital services are making cloud the centerpiece of new digital experiences.”
Although an extensive discourse on the cloud-native ecosystem is outside the scope of this article, it is necessary to provide a brief overview of the cloud-native paradigm.
The research paper titled “Cloud-Native Applications,” published by IEEE, describes the generally accepted translation of the term cloud-native as meaning nothing more than an application hosted on cloud servers and not on on-premises computers.
However, this expression means so much more than that. Cloud-native is also a design pattern providing the blueprint for architecting an application built specifically for the cloud, not just uploading a monolithic on-premises software application onto the cloud.
Therefore, based on this description, the key characteristics of this blueprint (or design pattern) include the following components and architectural principles:
It is not only beneficial to consider these components and architectural principles, but it is mandatory to consider the properties of the cloud-native model.
Why?
Not only do these properties define what a fully operational cloud-native application should look like, but they also determine what components and architectural principles to utilize.
Essentially driven by the remote working and lockdown trends of the global pandemic, cloud-native applications must operate globally, serving users and customers across different geographic regions.
In other words, this partially defines the true nature of globalization or the increasing interconnected and interdependence of netizens geo-located worldwide.
Not only is the phenomenon driven by advancements in technology, communication, travel, transportation, and trade but it was accelerated due to the need for people to access software applications from their homes and now anywhere in the world as remote working continues to grow in prominence and become the de facto method for organizations to operate.
What does the need to operate globally entail?
It is reasonable to assume that to operate globally, all a cloud-native application must do is be accessible by anyone with Internet access. However, the true meaning is this and much more, including the following elements:
Note: A consistency model is a set of rules that govern the distributed system.
In Information Technology, the term “scalable” is defined as an application’s continued ability to function optimally when increased in size or volume to meet an increased workload. Moreover, the phrase “highly scalable” translates into the application’s ability to handle this workload without undue strain.
In the cloud-native context, applications must be highly scalable with thousands of concurrent users.
For instance, if we assume that you are the system owner of an eCommerce application with the stated transaction workload being 1000 requests per second. However, what happens if the number of requests per second increases tenfold?
If the application is not highly scalable, it will battle to process ten times its defined workload, slowing down and eventually failing.
Note: While a discussion on containers and containerization is not part of this article’s scope, it is essential to note that we predominantly scale containers and not virtual machines in cloud-native applications.
There are two types of scaling: vertical and horizontal scaling.
In vertical scaling, we increase the power and capabilities of each container, including upgrading the CPU, adding more RAM, and attaching bigger and faster storage.
On the other hand, horizontal scaling is where we increase the number of containers to handle the increased workload.
While vertical and horizontal scaling is often understood as scaling an application up, not down. However, scaling an application’s resources down is equally important, especially when the workload is reduced.
Therefore, a revised definition of “highly scalable” must include the ability to scale up and down without affecting the application’s ability to handle the fluid workload without any adverse effects.
For example, the following diagram describes when we need to scale resources up and down.
In other words, this diagram shows that we only need two containers to process the workload from one user. However, when the user requests increase from one to three users, we scale the number of containers from two to five.
Note: The number of containers in relation to user requests is purely hypothetical and meant to describe a principle.
Historically, when applications were developed for execution on an on-premises server, the assumption was that the underlying hardware and operating system were stable; thereby, the risk of application failure was low. Nonetheless, when these applications were ported to the cloud, this risk rose exponentially.
Why?
The law of large numbers guarantees that, even when failure rates for hardware or networks are low, something is always broken or is about to break when you attempt to run an on-premises application on a global scale.
This is why it is imperative for cloud-native applications to be designed with the principle: “Infrastructure is fluid and failure constant” foremost in the development team’s collective minds.
But what does this principle mean?
The statement “Infrastructure is fluid and failure constant” describes two fundamental characteristics of the cloud-native architectural model.
In cloud-native computing, infrastructure is changeable because it can be rapidly provisioned, scaled up or down, and de-provisioned based on demand. Cloud-native infrastructure allows organizations to flexibly allocate computing resources as needed to match varying workloads, enabling efficient resource utilization and cost optimization.
In cloud-native computing environments, failures are considered a natural and expected part of the application’s operation.
Remember the law of large numbers? With many interconnected components, nodes, and services, the probability is that individual components will occasionally fail or experience issues. Cloud-native applications are designed to be resilient and tolerate failures by leveraging techniques like load balancing, auto-scaling, and redundancy to ensure continuous availability even when individual components fail.
In cloud-native application architecture, security must be integral to the application and not added as an afterthought or after the application has been completely developed.
Why?
Cloud-native applications execute in dynamic and distributed environments, often handling sensitive data and critical workloads. Therefore, security is vital to protect this data, prevent unauthorized access, and ensure the application’s integrity and continued availability.
Some of the key reasons why security must be integral to a cloud-native application include:
Based on these cloud-native properties, it is reasonable to conclude that cloud-native is a design pattern that has the capacity to provide developers with a blueprint to build highly adaptable, efficient, and resilient applications that check all the boxes for modern cloud-computing environments and provide the flexibility needed to address the ever-changing business requirements.