Posted with : Studying, Cloud Platforms
Getting started with Azure Storage
In this post I will share my little POC on Azure Cloud Storage including Blob / Queue. There are other ones like DocumentDB / Azure Tables / SQL Database, I had worked with but another post will cover these parts later. All code samples can be found in this repository on github
##The requirements
So we will cover below points about Azure Storage
Blob
-
Upload a file to server, store the file in Azure Blob
-
Create Blob Containers
-
List all Containers
-
List all files (blobs) by a Container
Queue
-
Create new queue
-
Add new messages to the queue
-
Process all messages in the queue (peek the message, process it and stored into an Append Blob, delete message)
##Set up a project
You can create a blank MVC project then install this package WindowsAzure.Storage (current version is 5.0.2).
Go to Azure Portal to get Account Name
, Account Key
to build connection string. This is an example
##Creating client
To work with any Azure Storage service, below steps are required
-
Parse connection string to
CloudStorageAccount
-
Create a client, for Azure Blob it is
CloudBlobClient
, andCloudQueueClient
is for Azure Queue…
##Work with Blob
Below is Blob service concepts
To store any files to Blob, we must manage to create containers then blobs will be added in each.
- Block blob has 200GB limit.
- Append blob is similar to
Block blobs
and is optimized for append operations. - Page blobs ha 1TB limit, is more efficient for frequent read/write operations.
For details, this link has described them. Below are some scenarios on Blobs
List all containers
var containers = _blobClient.ListContainers(detailsIncluded: ContainerListingDetails.Metadata);
var containersDict = containers.ToDictionary(x => x.Uri, x => x.Name);
Get all blobs in a container
var container = _blobClient.GetContainerReference(uri);
var blobs = container.ListBlobs(useFlatBlobListing: true);
Result of the ListBlobs method are a collection of IListBlobItem
but it will actually be one of these concrete types
BlockBlob
, AppendBlob
, PageBlob
.
Upload data to blob
This code does upload a file stream from HttpPostedFileBase
to a blob.
var container = _blobClient.GetContainerReference(DateTime.Today.ToString("yyyy-MM"));
var blob = container.GetBlockBlobReference(string.Format("{0}_{1}", DateTime.Now.ToFileTime(), fileName));
blob.UploadFromStream(file.InputStream);
##Work with Queue
For detail, you can refer to this document with deep information.
Add message to the Queue
-
We must ensure the queue exists before working with, below is an example
var cloudQueue = _queueClient.GetQueueReference(DateTime.Now.ToString("yyyy-MM")); cloudQueue.CreateIfNotExists();
-
Then we can freely add any message into it
var newMessage = new Message() { CreatedAt = DateTime.Now, Content = "A sample message" }; cloudQueue.AddMessage(new CloudQueueMessage(newMessage.Serialize()));
newMessage.Serialize() is an extension method provided by Rabbit.SerializationMaster
framework.
You can use strategies included in that package, or you can install an concrete implementation such as Rabbit.SerializationMaster.ServiceStack
.
They’re available on nuget.org.
Process messages in the queue
To adapt the requirements, we will need to:
- Get the next message in the queue
- If there is any, process the message. Otherwise, ends the loop.
- Add the result by appending to another Append Blob
- Delete message from the queue
- Continue step 1
Below is completed code for all above steps
// Get the queue on Azure
var cloudQueue = _queueClient.GetQueueReference(name);
// Prepare an Append Blob
var container = _blobClient.GetContainerReference(DateTime.Now.ToString("yyyy-MM"));
container.CreateIfNotExists();
var blob = container.GetAppendBlobReference("Messages");
if (!blob.Exists())
{
blob.CreateOrReplace();
}
while (true)
{
// Peek a message
var queueMessage = cloudQueue.PeekMessage();
if (queueMessage == null)
{
break;
}
// Process the message
var message = queueMessage.AsString.Deserialize<Message>();
message.ProcessedAt = DateTime.Now;
// Append to a storage
blob.AppendText(message.Serialize());
// Delete message from the queue
queueMessage = cloudQueue.GetMessage();
cloudQueue.DeleteMessage(queueMessage);
}
References