Table
Table Storage供给我们一个云端的表格结构,如图。Windows Azure提供的Table服务结构图如下。Account指的是云端存储服务账户。Table指的表格结构,Entity指的是记录。
我们可以把他想象为XML文件或者是一个轻量级的数据库。使用Table Storage的方法依然是调用REST API。有关Table Storage REST API的详细信息,请参见Table服务API。
为便于理解,我们演示如何创建一个Table对象,存取记录。代码逻辑如下:
1. 取得存储服务账户
2. 创建表格,命名为”customer”
3. 插入两条记录,客户ID分别设置为0和1
4. 删除插入的两条客户数据
表结构如下:
Main方法中加入如下代码 (请确保已安装Windows Azure SDK):
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var tableStorage = storageAccount.CreateCloudTableClient();
// 检查名为Customer的表格是否被创建,如果没有,创建它
tableStorage.CreateTableIfNotExist("Customer");
// 创建表格服务上下文
var context = new CustomerContext(storageAccount.TableEndpoint.AbsoluteUri, storageAccount.Credentials);
// 插入两条客户信息数据,客户ID分别设置为0和1
Customer c1 = new Customer() { ID = "0", Name = "Mike" };
context.AddObject("Customer", c1);
Customer c2 = new Customer() { ID = "1", Name = "Peter" };
context.AddObject("Customer", c2);
context.SaveChanges();
// 查找ID为1的客户数据并显示
Console.WriteLine("Retrieve information of a customer whose ID is 1");
var query = context.CreateQuery("Customer").Where(c => c.ID == "1").ToList();
var returnedCustomer = query.FirstOrDefault();
Console.WriteLine(string.Format("Customer info retrieved: ID:{0},Name:{1},Age:{2}",
returnedCustomer.ID, returnedCustomer.CustomerName, returnedCustomer.CustomerAge));
// 删除插入的两条客户数据
context.DeleteObject(c1);
context.DeleteObject(c2);
context.SaveChanges();
Console.WriteLine("The records has been deleted");
Console.ReadLine();
}
表格服务上下文CustomerInfoContext的定义如下:
public class CustomerInfoContext : TableServiceContext
{
public CustomerInfoContext(string baseAddress, StorageCredentials credentials) :
base(baseAddress, credentials)
{
}
}
Queue
Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。Account指的是云端存储服务账户。Queue指的队列,Message指的是队列的数据载体——消息。
一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间。这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后台再运行一个程序从队列中取得数据进行信息的处理。从这个角度来讲,Queue 可用作Web Role 和Worker Role 之间的消息传递。
我们依然可以使用Queue Storage的REST API来很方便地使用它。有关Queue Storage REST API的详细信息,请参见Queue 服务 API。
为便于理解,我们演示如何创建两个程序并实现一个读队列,一个写队列。代码逻辑如下:
1. A程序每隔5秒钟向队列queue中写数据。
2. B程序每隔5秒钟queue中读数据,处理,最后删除。
A程序的Main方法如下:
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var queueStorage = storageAccount.CreateCloudQueueClient();
// 检查名为myqueue的队列是否被创建,如果没有,创建它
var queue = queueStorage.GetQueueReference("myqueue");
queue.CreateIfNotExist();
Console.WriteLine("A is running...");
while (true)
{
// 插入数据到队列中
queue.AddMessage(new CloudQueueMessage(“sending data”));
// 每次插入数据后线程休息5秒
Thread.Sleep(5000);
}
}
B程序的Main方法如下:
{
var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var queueStorage = storageAccount.CreateCloudQueueClient();
// 检查名为helloworldqueue的队列是否被创建,如果没有,创建它
var queue = queueStorage.GetQueueReference("helloworldqueue");
queue.CreateIfNotExist();
Console.WriteLine("B is running...");
while (true)
{
// 从队列中读取一条信息
// 收到信息后可以根据收到的信息做处理,为了演示方便我们这里只是把信息显示出来
// 在云端发送消息后这条消息将对于后续的请求不可见,但是并未被删除。我们需要显示删除它。
// 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。
// 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。
// 详情请参考MSDN文档
var message = queue.GetMessage();
if (message != null)
{
Console.WriteLine(string.Format("Message retrieved: {0}", message.AsString));
// 处理完数据后必须显示删除消息
queue.DeleteMessage(message);
}
// 每次读取数据后线程休息5秒
Thread.Sleep(5000);
}
}