I spent the day at an Azure bootcamp today, run by Neudesic. They provided a good overview of the platform and its various components. Microsoft, while making a big play for the cloud, is really pushing its "Software + Services" strategy. They don't want you to move all your assets to the cloud, that would cost them too much in terms of lost license revenue. No, they want you to extend your current software with cloud services.
Main components of Azure:
Windows Azure represents the nuts and bolts of the MS cloud: Compute == Virtual Machines, and Storage and Management, well, that's obvious.
SQL Azure is a bare bones SQL Server engine, no Business Intelligence, SQL "lite" capabilities, and it quickly maxes out at 50GB. But if you're moving to the cloud, you should be leaving that behind. If you really want to scale you should be focusing on Azure Storage's NoSQL options: tables, queues, blobs. Microsoft makes SQL Azure quite a bit more expensive than using Azure Storage.
Azure AppFabric adds access control via claims-based tokens, and firewall-bypassing connectivity via Microsoft's ServiceBus.
Costs are very similar to what Amazon currently charges, apparently deep with discounts available "if you contact your Microsoft rep"
One question that always comes up when discussing the cloud is SLA. Microsoft used to be trailing Amazon here in terms of specifying SLAs. No more, their SLAs now are 99.9% and higher. Though you'd need to look into what kind of compensation they give when they exceed their SLAs.
As you'd expect the Azure developer experience is good. The tools are well integrated with Visual Studio 2010 and the local dev environment seems to work pretty well (though I didn't get a chance to deploy a complex app to it).
Azure Tools for Visual Studio 1.2 was released last week and adds these features
- VS 2010 RTM support
- .NET 4 support
- Cloud storage explorer
- Integrated deployment
- Service monitoring
- IntelliTrace support for services running in the cloud
The big one here IMO is IntelliTrace (good overview: http://msdn.microsoft.com/en-us/magazine/ee336126.aspx), gathering this much info from apps running in the cloud is very cool. Sadly you need to shell out major $ as IntelliTrace is only shipped with VS 2010 Ultimate.
Apparently many people ask about the ability to debug in the cloud. The answer, based on this pretty scary slide, is that Microsoft really doesn't think this is good for you :-)
While I found the tools worked well on my local dev environment, things were different while in the cloud itself. The management website is slow, 5-15 sec per page is slow when I just want to get my app deployed. Unfortunately that pales in comparison to the 10-20min it took to get my app running in a VM. This really hurts, esp. if you're used to a fast code/run/test cycle. Sure you can do this on you local but I have a feeling that a lot of bugs and some features may need to be worked on in the cloud, resulting in significant productivity loss.
Other notes:
- Azure can run .exe and native libraries but you'll almost certainly need to run them in full trust mode and remember that this is a a 64bit platform...
- A fast way to push data to the cloud: Create a VHD, upload it to the cloud as a page blob and you can mount it as a drive. You can have multiple readers but you have to manage write access yourself
- Queue messages are limited to 8KB and have to be explicitly deleted. When you read a message you specify a timeout (default 30sec?), if you haven't deleted the message in time it will be reinserted in the queue. This does introduce a race condition but Microsoft erred on the side of processing a message twice, rather than risk missing one. Fair enough (as long as it's a deposit to my bank account! :-)
- All Azure Storage exists in three replicas, writes don't return until they've written to all three
The day's wrap up included some best practices. Many were pretty obvious (e.g. run more than one VM for high availability) but I thought these were telling / useful / surprising:
- SOAP is out, REST is in (good!)
- Retry calls in Windows Azure, SQL Azure, and your own services (clouds can be unpredictable places, though in this case MS might as well build this functionality in)
- Use separation of concerns to isolate cloud / enterprise differences (came up in a discussion around using dependency injection to enable swapping out SQL Server for SQL Azure)
- Get as current as possible before migrating to Azure (if your app isn't already on the latest version of MS software, you'll have a hard time bringing it to the cloud)
- Migrate applications one tier at a time (Huh? I'd assume latency between tiers would kill the performance of the vast majority of apps)
It was an interesting day. Overall thoughts:
- Microsoft has come a long way since its first Azure release almost a year and a half ago
- Azure is clearly going after Amazon Web Services feature for feature
- Its philosophical difference with AWS remains: Azure gives you a greater abstraction (i.e. less to worry about) compared to the bare bones VMs of AWS, at the cost of some flexibility
- Azure gives you strong developer tools as long as you stay on your local dev environment
- But dev experience is painfully slow when round tripping to the VM can take 5-20 minutes. This needs to be fixed!
- We need more sophisticated NoSQL options (where is map/reduce?) esp. given the restrictions placed on Azure SQL
- Oh, and apparently an Azure private cloud announcement is in the works, music to the ears of large corporations everywhere!
Keep going Microsoft, competition is good!