I've been complaining about Windows Azure recently. Now let's see what other alternative could be out there.
NB: Unlike some earlier post, when I complained about Azure Queues for the enterprise scenarios and then some time later Lokad.CQRS framework for Windows Azure was released by Lokad, in this case I'm not planning to fix the situation myself))
I've been thinking lately about a .NET cloud hosting (platform as a service) I would love to use. Here's the overview.
It all starts with the open source .NET Cloud host (or worker role in Azure platform). In the ideal world it would be Mono compatible and capable of running on all the supported platforms (Linux, embedded, Windows etc). It does not need to be something complex - just a service (console app, daemon) that can establish an IoC infrastructure and run various processes, as defined by the configuration. Two primary processes to run are: message handler and task scheduler (yes, that's similar to Lokad.Cloud and Lokad.CQRS architectures).
Cross-cloud .NET host would be open source, so that anybody could fix the issues and send patches. Additionally, anybody could run it on their own server or cloud Virtual Machine, if needed. Local development and debugging scenario is covered here as well.
What about monitoring, debugging, diagnostics, statistics and all the other essential operation-level things? Well, these could be coded into the actual .NET host and available to user-defined components as interfaces provided and managed via IoC.
In addition to the operation-level components, the host would provide opportunity to leverage other elements of the cloud infrastructure:
- queues (simplified cloud or local AMQP);
- BLOB storage;
- Basic Management API (Open Stack, Azure API, Amazon EC2 API).
Note, that I'm not talking about any variations of table storage and SDBs. These are not essential to the cloud platform (in it's bare minimum), so they could be skipped from the first releases. Besides, IoC infrastructure allows to plug your own components and libraries anyway (just like Lokad.CQRS allows plugging NHibernate with session management right into the IoC).
Again, the core system should be dead-simple. Less code - less places for the bugs to hide, plus it's easier to deliver something usable early and start getting real-world feedback.
Ok, given that, the usage scenario with completely open-source do-it-yourself .NET host might look like this. Developer could take .NET Cloud host and:
- configure it to listen to Amazon SQS and use Amazon S3, add his own workflow components, then deploy to the Amazon cloud (Windows machine with .NET framework).
- or, use self-hosted RabbitMQ, Linux and Mono and use Rackspace Files.
- or launch .NET Cloud host on embedded devices (i.e.: same Linux with local queues occasionally connected to the cloud) and keep a few servers running in the cloud with Azure Queues, Blobs and Fabric.
In the simplest case it would cost developer about 11 USD per month to have completely isolated single instance of his .NET Cloud Host with guaranteed RAM and CPU.
That would work for a developer or company in need for a simple automation. Yet for majority of cases this would be a bit too expensive (in terms of money, time and management effort). You would need to do boring things like keeping track of running VMs, monitoring health-state, providing infrastructure for simple upgrades (with rollbacks, if needed), load-balancing, providing simple infrastructure for provisioning additional instances etc. That's where businesses might come in. For, say, monthly subscription of 25 USD (number taken of the top of my head without even trying to think about things like subscriptions, diverse packages etc), they could provide Web interface and simple management infrastructure to simplify tasks of deploying, handling and monitoring your cloud instances (provided you supply an API key for your cloud provider and pay for your cloud expenses yourself).
The usage scenario in this simple case would be like this:
- User gets tired of running and watching his .NET Cloud host himself on a dedicated server or cloud VM (Amazon, Rackspace, Azure etc).
- User registers at the Cloud Management provider, supplies an API key for his cloud and uploads his own .NET Cloud Host components.
- Cloud Management Provider will provision a preconfigured Cloud VM (i.e.: from the image with precompiled and optimized Mono and latest stable version of .NET Cloud Host with a few custom management enhancements), start it and launch with the .NET Cloud components provided by the customer.
- Launched system will be plugged into the overall monitoring and management infrastructure with some back automation and a nice Web UI to simplify handling complex routine operations (i.e.: upgrading a running instance with possible rollback and minimal downtime).
- Ideally, then customer will forget about the deployment.
slightly more advanced scenario - such company would handle payments as well.
Obviously, the .NET Cloud Host (that open-source project, I've mentioned in the beginning) would from the start consider and enforce design practices that lead to:
- simple code;
- reliable code;
- efficient usage for self-hosted solutions and any businesses that provide commercial services on top;
- enforce architectures that will work the best with the cloud environments and handle all the associated problems (i.e.: CQRS patterns and practices embedded into the overall design).
With web serves (and services), everything is slightly simpler, since you don't need almost any complexity to make them scalable. Web server could even be an Apache with some PHP that interacts with the business side over the JSON (reading views and posting commands). Although load-balancing this stuff (especially, while providing zero-downtime upgrades with opportunity to rollback on deployment or initialization errors) could be slightly tricky.
Obviously, business-oriented scenario might be about a company, initiating such an open-source project, while building commercial offer on top of it in parallel (an open-source project like this on it's own is a bit heavy for a single man).
Do you think somebody will deliver functionality like this any time soon?
NB: I know, there are at least two companies currently working to deliver a new offer in the field of .NET cloud computing. Please, consider scenario like this in your plans))