I’ve blogged about my attempts to understand the cost structure of serving (publicly over HTTP) large amounts of small files from Azure Blob Storage (or CDN for that matter). It was more complicated than it had to be and I’m still not sure I understand the reasoning behind it, but at least the answer was clear – you pay for both bandwidth and transactions if you serve files publicly from Azure Blob Storage.
Last week I had a pleasure to attend TechDays Belgium and I just couldn’t miss an opportunity to communicate my feedback on this issue to Scott Guthrie himself. I’ve also talked about it with Windows Azure MVPs Maarten Balliauw and Panagiotis Kefalidis. The funny part about this – they all start their responses with …
… but transactions are dirt-cheap!
Let’s see… We serve 100 million 7kb requests. That’s roughly 700GB of bandwidth. Since the pricing for North American and European bandwidth differs from rest of the world, let’s assume that 500GB goes to NA/EU and 200gb elsewhere. By entering this data into Azure pricing calculator we get this:
Transactions would cost us approximately as much as bandwidth. So no, transactions are not dirt-cheap. At least not in all scenarios.
But it’s not about the price - it’s about pricing structure
It took me a while, but now I understand how these things are priced. What I don’t understand is why? The most often repeated selling point of all the cloud services is “Pay for what you use”. So forgive me if I want to understand what I use when I’m billed for transactions. I understand that storage space costs something, I understand that bandwidth costs something, but I don’t understand where is the cost of “transaction”. It looks just like a HTTP request to me and for some odd reason I don’t get billed for HTTP requests to my web roles, huh? Does it cost Microsoft twice as much to serve 700gb in 7kb files than 700gb in 700kb files?
Don’t get me wrong, I’m not saying that there’s no cost associated with so called transactions. I’m just saying that it’s not communicated well enough.
What about CDN?
It was suggested by Maarten and Panagiotis that there are no transaction costs for CDN. I was pretty sure that we’ve researched that option and there was a transaction cost too, but who am I to argue with 2 Azure MVPs ;) Back home I’ve checked that I was right and that there is a very good reason why they thought otherwise. Here’s how the CDN portion of advanced pricing calculator looks:
Yep. No slider for transactions. When you hover the “?” you start getting some hints:
And only when you click the “Learn more” link it becomes crystal clear:
So, WTF do you want, Alan!?
Well, when I’m sold into “pay for what you use” model I want to actually understand what I use. And as I mentioned above it’s not very clear to me in this case. To be honest, I think the only reason why this pricing structure exists is because it was just copied from Amazon S3 in the early days:
and for CDN:
Except Amazon calls transaction “requests” which is way more clear in my opinion. Other CDN providers like CacheFly or MaxCDN/NetDNA don’t charge for transactions/requests (at least at the first glance).
So, most of all I’d like to see the transaction/request costs go away even if it doesn’t make the service cheaper overall. I don’t care how big margins on the bandwidth prices are as long as the end price is competitive. I would understand that I “pay for what I use”. Unfortunately this would skew the total costs for different scenarios dramatically. So I don’t expect it to change in a foreseeable future.
At the very least I would like to see this cost structure explained clearly. I figured it out but it took me some time and from conversations I had on twitter it’s pretty clear to me that everyone except those who are deep into Azure (MVPs, MS people) couldn’t answer my question by just looking at the site.
Here’s my feedback on what could and should be improved (if changing the pricing structure is not a feasible option):
- Explain what “transaction” is and why it is billed. Why are public HTTP requests to the Blob storage billed and HTTP requests to the Web Role are not? (I think “request” is a much better word saving a lot of explaining.)
- Mention public HTTP blob serving scenario explicitly. Billing in public HTTP blob serving scenario is confusing in the current state of things. Use of the word “transaction” clearly doesn’t help.
- Include a transaction cost slider in the CDN portion of the advanced pricing calculator. It’s really confusing currently and looks like a hidden cost. Even Azure MVPs were fooled by it. It’s obvious that mere mortals would be too.
So, this is what I think. I know it looks like a rant, but I just want to make the product better and provide feedback from the average customer’s point of view. This cost structure makes Azure and Amazon CDN (and storage) services unattractive to projects serving large quantities of small files and I’m just not sure that there’s a good reason for Microsoft and Amazon to shut these customers out.