基于云存儲實現用Windows Azure Storage增強應用程序的引擎
現在,我們需要一個簡單的包裝來與我們的隊列交互。從本質上說,我們需要能夠將消息插入隊列,獲取任何掛起的消息并清除該隊列(請參見圖 3)。
圖 3 用于與隊列交互的包裝
namespace HollywoodHackers.Storage.Queue
{
public class StdQueueT> :
StorageBase where T : QueueMessageBase, new()
{
protected CloudQueue queue;
protected CloudQueueClient client;
public StdQueue(string queueName)
{
client = new CloudQueueClient
(StorageBase.QueueBaseUri, StorageBase.Credentials);
queue = client.GetQueueReference(queueName);
queue.CreateIfNotExist();
}
public void AddMessage(T message)
{
CloudQueueMessage msg =
new CloudQueueMessage(message.ToBinary());
queue.AddMessage(msg);
}
public void DeleteMessage(CloudQueueMessage msg)
{
queue.DeleteMessage(msg);
}
public CloudQueueMessage GetMessage()
{
return queue.GetMessage(TimeSpan.FromSeconds(60));
}
}
public class ToastQueue : StdQueueToastQueueMessage>
{
public ToastQueue()
: base(toasts)
{
}
}
}
我們還需要為表存儲設置一個包裝,以便在用戶登錄到站點之前可以存儲用戶通知。可以使用 PartitionKey(行集合的標識符)和 RowKey(可唯一標識特定分區中的每個單獨行)組織表數據。選擇 PartitionKey 和 RowKey 使用的數據是在使用表存儲時所做的最重要的設計決策之一。
這些特點允許跨存儲節點進行負載平衡,并在應用程序中提供內置的可伸縮性選項。不考慮數據的數據中心關聯性,使用同一分區鍵的表存儲中的行將保留在相同的物理數據存儲中。因為針對每個用戶存儲對應的消息,所以分區鍵將是 UserName,而 RowKey 則成為標識每行的 GUID(請參見圖 4)。
圖 4 表存儲的包裝
namespace HollywoodHackers.Storage.Repositories
{
public class UserTextNotificationRepository : StorageBase
{
public const string EntitySetName =
UserTextNotifications;
CloudTableClient tableClient;
UserTextNotificationContext notificationContext;
public UserTextNotificationRepository()
: base()
{
tableClient = new CloudTableClient
(StorageBase.TableBaseUri, StorageBase.Credentials);
notificationContext = new UserTextNotificationContext
(StorageBase.TableBaseUri,StorageBase.Credentials);
tableClient.CreateTableIfNotExist(EntitySetName);
}
public UserTextNotification[]
GetNotificationsForUser(string userName)
{
var q = from notification in
notificationContext.UserNotifications
where notification.TargetUserName ==
userName select notification;
return q.ToArray();
}
public void AddNotification
(UserTextNotification notification)
{
notification.RowKey = Guid.NewGuid().ToString();
notificationContext.AddObject
(EntitySetName, notification);
notificationContext.SaveChanges();
}
}
}
評論