The cloud, it's a term thrown around in casual conversation these days. Microsoft's ad campaign directed “To the cloud!", Apple crams iCloud down your throat at every opportunity, billboards on my commute say nothing more than “Cloud Computing" on them. Most people don't even know what it is or what it means, and frankly they don't care, it just sounds cool. To the layman, the cloud is synonymous with the internet itself, and if they're talking about SaaS products, they're basically right. To developers dealing with cloud computing it's more complicated however.
To be clear, I'm talking about public cloud computing in terms of infrastructure. In particular the big players in the space:
Amazon - AWS
Microsoft - Azure
Google - Cloud Platform
RackSpace - OpenStack
For years I've explored cloud computing, and in those years I've yet to find a project that made me say “Yes, this belongs in the cloud". Obviously you could blame my projects, they don't have enough users, they aren't critical enough, whatever. Or you could blame the fact that I'm very comfortable with administering dedicated servers and a little less so with cloud instances. But I'm not exactly sure at what point the cloud is the way to go, especially in the beginning.
When you're starting out a new SaaS project you generally have some minimal requirements. You'll need a web server and probably a database server. When you're just getting your application off the ground it will have a low amount of users that you hope to grow over time. The number of users will determine the load on your server and the server specs will determine how many users are too many. So where do you start? With a dedicated server or straight to a cloud server?
For startups I believe there are two broad approaches to building an application and the infrastructure to run it on:
A) - pessimistic - Build it quickly, get it out there, and validate the business before spending the time to engineer it for scaling.
B) - optimistic - Build it carefully, code for scalability, and launch it with the assumption that it must scale quickly.
With method A, your primary goal is to get the thing off the ground and hope that scaling becomes a concern. If you start to exhaust the resources on your initial server, you're probably gaining traction in the market. You can buy yourself some time by scaling vertically (adding more RAM, CPU power etc.) while you work on re-engineering your code for horizontal scaling.
With method B, you're sold on the viability of this product and you know it's going to be a hit. You believe that any hiccups in service would be more damaging than coming to market later. Therefore, you're going to spend the time to code the software for scalability up front and configure your infrastructure for growth.
Both methods have their pros and cons. I personally go with method A 9 out of 10 times since I know all too well the unlikelihood of having an app reach millions of users. Regardless, if you want to scale out horizontally, your software must eventually be written in a way that allows that to happen. With both methods you have a choice to make on your initial server setup. Both will run just fine on a single instance cloud platform or a single dedicated server (yes, I'm aware there are options other than these two). A decent dedicated server can take you well beyond an initial launch for most companies but a small cloud instance may be cheaper in the short term.
Here are some Pros and Cons to each to help with the decision:
No hardware to buy/maintain
Unlimited instance scaling
Unlimited disk scaling
Pay for what you use
Resilient and Redundant
Bandwidth limited and expensive
Disk space expensive
SQL storage expensive
Lower performance in many cases
Lack of control
Dedicated Server Pros
Abundant disk space (to start)
Inexpensive disk space
Bandwidth is cheap
SQL storage is cheap
Room to grow
Dedicated Server Cons
Always paying for maximum power
Limited physical disk space
Physical scaling limit (vertically)
Configuration and Management
The cost of going the cloud route is difficult to figure out. Each platform has different pricing terms and different factors that weigh into the cost. Most of them have a free tier now as well that would be enough to host a website but not a lot more.
A dedicated server in a data center somewhere is easier, the cost per month for a decent box (Quad core Xenon, 4GB RAM, 500GB disk, Linux OS) will be around $160/month at SoftLayer. In comparison, a far weaker small cloud instance with Microsoft Azure (1.6Ghz CPU, 1.75GB RAM, 100GB storage) would be around $70/month or less than half that of the dedicated. The important distinction is that you may not need all of the power that the dedicated option provides and could be saving $90/month until your application grows its user base.
To scale out a dedicated server horizontally, you'll need to add a minimum of 1 additional server, usually a dedicated database server. To go beyond that you'll need to add more web servers and throw a load balancer into the mix. You also need a way to manage the configuration, application, and data on each of the physical servers. This all takes time and it gets complicated quickly.
To scale out a cloud computing instance, you spin up additional machine instances and provision them with your application. This takes basically no time. You still create dedicated SQL server instances and you still create multiple web app instances but the cloud platform gives you the tools to manage your data across all of them easily. They also provide load balancing or traffic management services to spread requests across healthy instances.
Like I said earlier, in either case your software needs to be written so that it can be scaled horizontally. If it's not, the cloud can't help you. Where the cloud can help you in all phases however is in its resiliency and redundancy. There is no single point of hardware failure in cloud computing. The odds are in your favor that there will not be a catastrophic data loss in your storage, though it has happened. That risk is much higher on a single dedicated server.
With a dedicated server, you have the option to move into the cloud once it's time to scale out, you haven't backed yourself into a corner. Writing complex software that can scale is very challenging and time consuming and that is the main deciding factor that keeps me launching products on dedicated machines. They give you plenty of room to grow into, plus the freedom to do anything you please with the software and hardware while you're sorting out your product. If you need to scale, great, the server should hold you over while you make the transition to the cloud.
I started out writing this post under the assumption that I still don't have a good reason to move to cloud hosts, but cloud platforms are evolving so quickly that it's becoming more difficult to argue against them. There is definitely a learning curve to managing and deploying in the cloud but that is no excuse to ignore the right option for a task. If your application is simple enough where concurrency and threading are not major hurdles, or if you've got the time to engineer your software to scale right out of the gate, launching on a cloud platform might just be your best option today. If you've had similar experiences or are evaluating this decision, I'd be interested to know what factors came into play, which route you chose, and why.