We are in the process of designing new major features for AdDuplex. So we were discussing some implementation/architecture choices for a future release. Part of the implementation we were planning to pursue included serving of content directly from public container in Azure Blob Storage over HTTP.
Since Azure (as most of the Cloud solutions) is a “pay for what you need/use” type of arrangement we had to look at pricing for Windows Azure Blob Storage and decide if our proposed implementation was the best choice from the cost effectiveness perspective.
The price for the blob storage consists of 3 components: storage space, bandwidth/traffic and transactions. Space pricing is clear, bandwidth pricing is clear, but what is transaction??
The explanation next to the transaction slider in the pricing calculator doesn’t help much:
You pay based on the average amount of data you store during a billing cycle and the number of read/write transactions you make to it during that period.
Again: what’s the definition of transaction in this context? Browsing the Windows Azure site doesn’t help much.
The most comprehensive resource on the web (at least the one I was able to find) explaining Azure Storage billing in detail is this blog post by Brad Calder from 1.5 years ago. Let’s see if it helps.
We finally have some definition of transaction:
Transactions – the number of requests performed against your storage account
Judging by this succinct definition we may conclude that we should consider each request to a PDF we’ve posted publicly to the blob storage as a transaction. OK, but let’s read further (emphasis mine)
Each individual Blob, Table and Queue REST request to the storage service is considered as a potential transaction for billing. Applications can then control their transaction costs by controlling how often and how many requests they send to the storage service.
OK, so if I place a PDF into blob storage and it is accessible publicly as http://mystorageaccount.blob.core.windows.net/mycontainer/mydoc.pdf and then it’s picked up by CNN.com and linked from there, there’s no way I can control “how many requests I send to the storage service”. So I would guess this case should not be a subject to transaction billing.
Then we have this:
Each and every REST call to Windows Azure Blobs, Tables and Queues counts as 1 transaction (whether that transaction is counted towards billing is determined by the billing classification discussed later in this posting)
Again, there’s no definition what is considered a “REST call” here, but GET request over HTTP is probably a “REST call”, right? So, by this point I got totally confused and I decided to let the twitter enlighten me. After some back-and-forth Neil Mackenzie (Azure MVP) concluded:
OK, I believe Neil, but how am I supposed to know that someone accessing my public file is “A single GetBlob request to the blob services”? Still, at this point, I was convinced that each such request is basically billed twice: once for the bandwidth and the second time for transaction. But just to make sure I decided to make an official support request to clarify this once and for all and I got this answer:
As discussed over the call every single request coming to our blob is considered as a transaction. Hence we count this transaction as a storage transaction and this component will be shown in the invoice.
So, there you have it. I’m not sure if the concept is logically flawed or just a structured way to charge you more, but I’m sure it has to be explained in simpler terms and definitely cover this simple public blob scenario.
Don’t get me wrong, I understand that if there’s a cost associated with each transaction someone has to pay for it. It’s perfectly clear with bandwidth or storage. You can argue about the prices, but it’s pretty obvious it costs something. But with these “transactions”… I don’t know. I need more clarity.
What do you think? Is this a logical billing structure? Do you understand where’s the per-transaction cost to Microsoft that is then passed to you in this scenario? Should you be charged a transaction fee for each request of a public image on your site? Honestly, it doesn’t make much sense to me.