written 6.2 years ago by |
Cloud technologies significantly changed the software market. Easy access to compute, network and storage resources with predicted costs and available in multiple regions helps to speed up time-to-value.
Before you start to design application architecture for the cloud, you need to start from a consideration of the main common quality attributes of the cloud:
Scalability is a capability to adjust a system capacity based on the current needs. For example, let’s say you’re developing an internet shop. You know that before Christmas, the number of orders will grow significantly and you need additional resources in order to handle every request. At the same time, during periods of normal operation, you don’t need as many resources.
Availability is the time when the system is functional and working.
Monitoring. In general, you need to think of the cloud as a remote data center. At the same time, you need to take into account that you may have a great number of servers and also consider the dynamic nature of the cloud.
Security is the capability of the system to prevent data loss, information leaks, and unauthorized usage.
Cost. You have unlimited access to the compute, storage and network resources and pay as you go, and any resources have their own cost. If you can’t use these resources wisely, you may pay a high cost.
Time-to-market is the time that is required to deliver your service to customers.
All these challenges are input for the application architecture design. In the architecture, you need to provide answers on how you’re going to respond to these challenges. In order to do this, you need to apply architecture tactics that give you a vision on how you’re going to achieve defined system quality attributes.
Time-to-market
The key driver of architecture decisions, in most cases, is time-to-market. Business always dictates when the system needs to go live in order to archive an organization’s goals. To achieve time-to-market, you need to consider the following things:
Build versus buy. It is always attractive for software engineers to create something cool and brand new from scratch. However, it can require a significant amount of effort
Development environment: When you design a solution, you need to choose a technology stack and services that each developer in your team may use to work on tasks. Developers need to have isolated environments to work independently.
Scalability
There are two ways to manage your system capacity:
You may add more CPU, memory and storage to a server—vertical scalability.
You may add more servers if you need more processing power or reduce the number of servers when you don’t have a need to keep a full fleet of servers. This approach is called horizontal scalability.
Availability
The general strategy for an architecture design for the cloud is to design for failure. You need to consider that cloud services and third-party services can sometimes be unavailable. The cloud provider may terminate your service in order to move it on another server rack without any notification in case of a hardware failure.
General tactics to achieve high availability are:
Reduce single points of failure. You need to assume a reductant number of servers.
Distribute your servers and services between different geographic locations.
Use messaging for communication between components. It can guarantee that you will not lose a message when a component is unavailable.
Monitoring
If you have just one server or even a few servers, you may get system metrics. Check an application status or check logs. However, what do you do if you have hundreds of servers and the servers can be added or replaced at any point in time?
• Choose a system monitoring solution.
• Aggregate logs and store on reliable storage.
• Implement health checks endpoints for each system component.
Security
Security is always important. First, you need to decide how you’re going to manage access to the cloud. Each cloud provider supplies their own solution for Identity and Account Management (IAM).
The solution gives you the ability to configure granular access to cloud resources. Then, you may apply the following recommendations to your solution:
Encrypt communication between service components.
Encrypt all sensitive information.
Grant the minimum required access level to the cloud services for your application.
Design a solution to rotate encryption keys and credentials.
Use virtual private networks and expose only public endpoints to the internet.
Cost
Always check cloud pricing and available discounts to achieve cost optimization.
Horizontal scalability is a powerful tool for cost optimization. However, it is not a silver bullet. In some cases, it makes sense to choose a bigger server.
Shut down unused resources. If you know that a minimum number of users access the system at night, you may shut down and spin up servers by schedule or any other metric, available in the cloud.