December 3, 2024

Applications adaptable to changes

Applications adaptable to changes

“The strongest species does not survive, nor does the most intelligent species. Survive the one that best adapts to changes”

Charles Darwin

A “cloud native” application, like all native species, has adapted and evolved to be as efficient as possible in its natural environment: the cloud.

When we talk about a cloud environment, we refer to both public and private clouds, which are basically built of the four basic elements or resources of a computer: network, disk, memory and CPU.

The cloud is a more severe environment for applications than the environments of the past, such as, for example, a monolithic three-layer system, where your data resides in a database on a single node.

In the cloud, an application is distributed. Therefore, it is forced to be resistant to the unpredictability and unreliability of the hardware or network, that is, it must contemplate anything from a slight variation in its performance to a total failure.

For example, although the new solid-state disk storage systems are faster than their predecessors, their reliability is substantially lower, which implies that we believe that when we send something to the cloud that data persists without problems and that is less and less true.

The main limitations of the cloud environment include:

  • Applications have a limited ability to scale vertically on basic hardware, which generally leads to having many isolated autonomous services (microservices).
  • All communication between services takes place over unreliable networks.
  • It must operate under the assumption that the underlying hardware can fail or restart or move at any time.
  • Services must be able to detect and manage peer failures, including partial failures.
  • Transactionality and strong consistency are more expensive to achieve. Because of the coordination required, it's difficult to make services that manage data available, efficient, and scalable.

A “cloud native” application, like all native species, has adapted and evolved to be as efficient as possible in its natural environment: the cloud.

While it's difficult to guarantee responsiveness and reliability in this type of harsh environment, the applications we create after adopting this environment are better suited to real real-world operation. This, in turn, provides better experiences for our users.


Therefore, a “cloud native” application is designed to take advantage of the cloud operating model. It's predictable, decoupled from the infrastructure, is the right size, and allows for close collaboration between the development and operations teams.

One approach to cloud native applications that contemplates and considers all of these limitations is that of reactive systems.

The Reactive approach is a different approach to thinking, designing, building and reasoning about software systems, in particular distributed, highly concurrent and data-intensive applications, that maximizes our chances of success in building cloud-native applications.

The reactive principles, help ensure that applications are:

  • Responsive: reacts to change in a timely manner
  • Resilient: always available and self-healing
  • Elastic: allows you to scale horizontally and on demand, through efficient management of state, resources and communication, both local and distributed.

To ensure responsiveness, resilience and elasticity, the way in which the underlying infrastructure on which these applications “live” is managed is also key. To this end, in recent years there has been an important evolution in orchestrators, such as Kubernetes, which specialize precisely in managing, scaling and ensuring the availability of the boxes or containers that house these applications. But managing boxes properly is only part of the challenge, making the contents of those boxes work in tune with the cloud ecosystem is another.

Both the infrastructure and application layers are equally important and must work together to provide a comprehensive and consistent user experience.

Throughout the different projects we have carried out, we have been able to demonstrate these great advantages of reactive systems. The possibility of “not stopping” the system because some component is failing is key, for example, in one of the systems we implemented, the database, which was highly redundant, was housed in the same datacenter, and in the face of a loss of connectivity, the application continued to respond to the ingestion of information by storing the information in intermediate repositories, and applying circuit-breaker (thermal) patterns when writing to the database, that is, although it did not respond to certain queries the rest of the system was still working and no information was lost.


In short, the cloud-native reactive applications approach produces more efficient, robust, manageable, adaptable and agile applications and services.

At Peperina Software, we help you design and create responsive cloud native solutions that are better adapted to changes.