February 17, 2014 | Written by: Rene D. Svendsen
Share this post:
In a series of six blog posts, I will focus on how a migration from traditional development environments to ones that leverage the cloud impacts developers, their applications and the programming models they use. These blog posts will be based on my own experience as well as work conducted by the IBM Academy of Technology and the Cloud Standards Customer Council (CSCC). I also encourage you to read A reference model for moving your applications to cloud by Joydipto Banerjee and Migrating Applications to the Cloud: Roadmap for Success.
Cloud computing promises benefits often historically reserved for specialized solutions and hosting, based upon the virtualization of physical resources, and delivering operational efficiencies through automation and standardization. The pure virtualization of infrastructure is rarely a concern for developers and it represents the first obvious step in migrating an existing physically hosted application to the cloud. However, the popularity of cloud computing has given rise to a misconception around the cloud provider magically offering boundless elasticity, resiliency and performance. In reality, applications are either authored with the cloud in mind or need to become more cloud-friendly.
Enhancements are available to application developers to exploit cloud architecture. The simplest way to understand cloud opportunities is to understand cloud services as higher-level architectural components. Such understanding allows the mapping of existing application architecture constructs to potential cloud services. Based on a sound understanding of key sub-systems, the cost and benefit can be evaluated. Enhancing an existing application should require minimal or well-defined boundaries of work, preserving the core solution while gaining desirable cloud characteristics.
Hosting in the cloud
By off-loading existing physical hardware through migration of entire machine stacks to the cloud, the impact on the programming model is minimal. However, the developer begins to see operational benefits from cloud since they can replicate their machines quickly and easily for development, test and production. The enterprise begins to see savings in operational and capital expenses through this most basic form of visualizing and standardizing of machine images.
The advantage of this type of cloud usage is that it allows for almost any application, compatible with traditional physical systems, to execute with few constraints. Two categories of issues that might arise are:
- Provider imposed constraints are those issues that prevent an application from having complete control over its environment. For example, the cloud infrastructure may deliver virtual desktops to users without administrator authority, which may in turn limit or break features of applications that require privileged access. The cloud infrastructure may prohibit certain access mechanisms. For instance, access over secure shell (SSH) may be allowed while other visual remote desktop technologies may be blocked, impacting applications with a desktop based user-interfaces.
- Application-defined constraints arise because the application was written with a particular physical machine in mind. For example, any machine-specific hard-coded properties might break the application if it is moved to another machine. Poorly designed applications often store system specific information as static properties and as such become relevant issues to keep in mind when moving to the cloud.
If the cloud is viewed as a remote hosting environment then, while there may be some financial and operational gains, many of the other benefits of cloud computing (such as auto-scaling) go unrealized. One way to take advantage of these features is to leverage the cloud provider’s management offering by allowing their virtual machine’s hardware aspects to be controlled on the user’s behalf—allowing for optimal resource utilization.
Vertical (hardware related) scaling offers some benefit to the user but could potentially be limiting. Ideally, the user looks towards a horizontal scaling solution (cloning of busy nodes) if they intend to support large workloads. In order to scale horizontally, the application needs to be designed in such a way that additional nodes augment and do not interfere with the deployment. For example, an application that writes data out to local disk isolates information from other cloned nodes that are in turn acting in the same manner.
In order for an application to leverage a horizontal auto-scaling feature, the developer needs to ensure that their application is designed to properly operate when multiple instances of itself are deployed or removed.
In my next blog post, I will focus on how to cloud orient applications through componentizing solutions.