In recent years there has been a boom in the field of cloud-hosted services. These are services offered on demand directly from the supplier, rather than being hosted in the customer's infrastructure. Cloud-related services are among the most strategic for technology departments during 2015, and more than half of the companies in the United States are already offering services directly from the cloud.
An important sector of this market is related to hosting services or web applications. Broadly speaking, there are two main categories: Infrastructure as a Service (IaaS) and Platform as a Service (PaaS). The first one focuses primarily on providing tools such as servers, firewalls, storage volumes and DNS, among others. The second one abstracts the entire infrastructure and exposes it to the developer as containers able to run applications in different languages and store data in different database technologies.
This type of service has meant a revolution for small businesses or independent developers who want to keep their costs down and also want to be able to scale to more or less capacity based on user traffic. Instead of having to purchase or lease hardware in a data center, with a few clicks they can start a virtual infrastructure remotely in any part of the world, ready to serve any type of application.
Obviously there is a great diversity of platform or infrastructure as a service providers, and it is not an easy task to choose one in particular. Bellow is a list of some of the main suppliers:
Amazon Web Services (AWS)
It is the largest provider (and one of the pioneers) of infrastructure in the cloud (IaaS). AWS allows creating virtual servers with different capacities and with preinstalled operating systems. The servers can be started or stopped at any time, and the cost is calculated per hour.
The main offering of AWS is to provide infrastructure, i.e. the servers don’t have preinstalled software (only the operating system). If the goal is to publish an application in PHP, Ruby or Python, the customer is responsible for installing and configuring all the dependencies manually. He also has to configure the load balancers and firewalls, and distribute the service in the different areas of AWS to ensure high availability.
AWS also offers a wide range of products in the cloud, such as a DNS manager (Route53), databases (DynamoDB, SimpleDB, RDS), storage of files (S3, EBS), backup (AMI), tails/messages (SQS ), notifications (SNS) and many others. These services complement and integrate well with each other. Some similar alternatives to AWS are Google Compute Engine and Rackspace Managed Cloud.
Heroku
Unlike AWS, which is mainly focused on the infrastructure, Heroku is focused on the platform (PaaS). Instead of servers, Heroku offers application containers called Dynos. The Dynos are preconfigured for different languages or technologies.
The biggest advantage of this paradigm is the speed with which you can publish an application in the cloud. With a “git push heroku master” command the application is ready to receive requests. There is no need to spend time configuring servers, firewalls or databases. All this comes at an additional cost, but usually for applications or small teams it is really worthwhile, as it saves a lot of problems and headaches that can arise if you also have to maintain the infrastructure.
The major disadvantage of services like Heroku is the lack of customization and optimization possibilities, which are available when there is more open access to the infrastructure. For a small application this is not a major issue; but for an application with tens of millions of hits a day, optimizations at the infrastructure level can mean the difference between running or collapsing, besides representing large cost savings. Some of the alternatives to Heroku are Google App Engine, Openshift, AppFog and DotCloud.
Parse
Parse is at a level of abstraction above Heroku, and it was born to satisfy the need of application developers to have a backend component. It was initially designed to support mobile applications, but over time it has ended expanding its services to any client application. The company was acquired by Facebook in 2013.
Parse provides a series of SDKs for developers to store and access information related to their applications and users in the cloud. The platform ensures that the information is backed up and that the service is always available. Besides storage services, Parse offers a wide range of cloud services that allow developers to implement notifications, scheduled tasks and data analysis.
Parse allows developers to create and publish applications in really short periods of time. There is no need to think about infrastructure, databases, scalability, availability or analytics. The platform takes care of everything and the developer can focus on the product, growth and sales.
The greatest advantage offered by Parse is at the same time its greatest weakness: since it abstracts all its technology in a series of services, once the application has been developed and published it is very difficult to move it to another place (usually requiring extensive changes or rewrites). There are also alternatives to Parse, including backendless and Appcelerator.
What should a developer use in each case?
If the service you want to build is very extensive in terms of computation or data management, it is better to invest and build on an infrastructure service. Although at the beginning it may require an extra effort, it can really avoid many problems and costs in the long run. Conversely, if the product is a mobile (or desktop) application that needs a simple backend functionality and share data between different platforms, Parse is a great option.
An intermediate solution is to use a PaaS, but developing an abstraction layer for all that is specific to that platform. Thus, once the product is growing it can be migrated to an infrastructure service, and at the source code level you will only need to adapt the abstraction layer to the new architecture.
It is very difficult to estimate from the beginning the scope or functionalities of an application in the long run, so it’s important to understand how these services can benefit each other. The general rule is: the more abstract the service, the harder it will be to customize or replace it in the future. But, at the same time, the development cycles and iteration will be shorter at the beginning, something that favours the rapid validation of the product.