概述:您能够在云中运转后台进程。Kevin Hoffman 和 Nate Dudek 运用购物车示例演示怎么构建应用程序引擎,以及怎么运用Azure Storage完结异步音讯传送和处理。
开发人员简略依靠其有形的、可感知的根底结构,就像其是“安全毛毯”。他们知道怎么运用、怎么操作,假如呈现问题,他们知道问题出在哪儿。而这通常会成为开发人员选用更新的技能(例如云核算)的妨碍。
心存置疑的开发人员提出的最大疑问之一是他们怎么在云中持续运转后台进程,即他们的引擎怎么持续运转。本文旨在经过向您演示怎么构建应用程序引擎以及运用 Windows Azure Storage 完结异步音讯传送和处理来为您揭开云中缺少后台处理的奥秘面纱。
为了证明开发人员能够抛开其有形的根底结构这条“安全毛毯”并将其应用程序引擎置于云中,咱们将介绍怎么完结电子商务应用程序的一个小型子集 Hollywood Hackers,您能够从中购买到 Hollywood 用于彻底疏忽物理规律和过期的知识的一切奇特技能。
咱们将介绍的两个首要计划如下:
将异步文本音讯 (“toasts”) 发送给运用该应用程序的用户,以告诉他们产生的重要事情(如已提交他们的购物车)或在职工之间发送音讯。此计划运用 Windows Azure Queue、Windows Azure Table 和 Windows Azure 工作者人物。
此计划运用 Windows Azure Queue 和 Windows Azure 工作者人物将购物车提交给履行引擎。
运用行列存储进行内部应用程序音讯传送
在介绍详细的计划之前,咱们需求先介绍一些有关 Windows Azure Queue 的根底知识。云中的行列与传统的 .NET 应用程序中的行列的运转办法不太相同。在处理 AppDomain 中的数据时,您知道该数据只需一份,它完好地坐落单一保管进程中。
而在云中,您的一部分数据或许在加利福尼亚,而另一部分或许在纽约,并且您或许会组织一个工作者人物在德克萨斯州对该数据进行处理,而另一工作者人物在北达科他州进行数据处理。
许多开发人员在习惯这种分布式核算和分布式数据时面临着一些不熟悉的问题,例如对或许呈现的毛病进行编码、针对数据提交构成屡次重试的概念乃至幂等性的理念。
只需您不将 Windows Azure Queue 视为进程内的惯例 CLR 行列,其工作办法其实十分简略。首要,应用程序将向行列获取一些数量的音讯(需求记住,一次不会超越 20 条)并供给一个超时。此超时操控对其他行列处理客户端躲藏这些音讯的时刻。当应用程序成功完结需求对行列音讯进行的一切处理后,将删去该音讯。
假如应用程序引发反常或处理行列音讯失利,则在超时期限往后,其他客户端能够再次看到该音讯。因而,当一个工作者人物处理失利后,其他工作者人物能够持续进行处理。向行列提交音讯十分简略:应用程序直接或凭借客户端库构成恰当的 HTTP POST 音讯,然后提交字符串或字节数组。行列专门用于进行内部应用程序音讯传送和非永久存储,因而这些音讯占用的空间需求适当小。
如上所述,您或许组织多个工作者人物都测验处理同一音讯。虽然躲藏当时正在处理的音讯的不行见超时很有协助,但不能保证满有把握。要彻底避免抵触,您应该将您的引擎处理规划为幂等。换句话说,同一行列音讯应该能够由一个或多个工作者人物处理屡次,而不会使应用程序处于不一致的状况。
抱负情况下,您期望工作者人物能够检测出是否已完结对给定音讯的处理。在编写工作者人物来处理行列音讯时,请紧记您的代码或许会测验处理已处理过的音讯,虽然这个或许性微乎其微。
图 1 中的代码段显现了怎么运用随 Windows Azure SDK 一同供给的 StorageClient 程序集创立音讯并将其提交给 Windows Azure Queue。StorageClient 库实际上仅仅 Windows Azure Storage HTTP 接口周围的包装。
图 1 创立音讯并将其提交给 Windows Azure Queue
string accountName;
string accountSharedKey;
string queueBaseUri;
string StorageCredentialsAccountAndKey credentials;
if (RoleEnvironment.IsAvailable)
{
// We are running in a cloud - INCLUDING LOCAL!
accountName =
RoleEnvironment.GetConfigurationSettingValue(AccountName);
accountSharedKey =
RoleEnvironment.GetConfigurationSettingValue(AccountSharedKey);
queueBaseUri = RoleEnvironment.GetConfigurationSettingValue
(QueueStorageEndpoint);
}
else
{
accountName = ConfigurationManager.AppSettings[AccountName];
accountSharedKey =
ConfigurationManager.AppSettings[AccountSharedKey];
queueBaseUri =
ConfigurationManager.AppSettings[QueueStorageEndpoint];
}
credentials =
new StorageCredentialsAccountAndKey(accountName, accountSharedKey);
CloudQueueClient client =
new CloudQueueClient(queueBaseUri, credentials);
CloudQueue queue = client.GetQueueReference(queueName);
CloudQueueMessage m = new CloudQueueMessage(
/* string or byte[] representing message to enqueue */);
Queue.AddMessage(m);
关于本文中的其他示例,咱们运用了能够简化此进程的一些包装类(坐落 Hollywood Hackers 的 CodePlex 站点中,网址为:hollywoodhackers.codeplex.com/SourceControl/ListDownloadableCommits.aspx)。
异步音讯传送 (Toast)
当今,交互式网站不仅是一种时髦,更是一种需求。用户现已习惯了彻底交互式网站,以致于当他们遇到一个静态的非交互式页面时会以为什么地方出问题了。考虑到这一点,咱们期望能够在咱们的用户运用这样的站点时向他们发送告诉。
为此,咱们将运用 Windows Azure Queue 和 Windows Azure Table 存储机制构建一个音讯传递结构。客户端将运用与 jQuery Gritter 插件结合的 jQuery 在用户的浏览器中将告诉显现为一个 toast,类似于当您收到新的 Outlook 电子邮件、即时音讯或警报声时在 Windows 体系托盘上方淡出的音讯。
当需求向某个用户发送告诉时,该用户将被刺进到行列中。由于工作者人物负责处理行列中的每个项目,所以该人物将动态确认怎么处理每个项目。在本例中,引擎只需求履行一个操作,但在杂乱的 CRM 网站或支撑站点中,要履行的操作或许不可胜数。
工作者人物在行列中遇到用户告诉时,会将该告诉存储在表存储中并将其从行列中删去。这样,音讯能够保存很长时刻并等候用户登录进行处理。行列存储中的音讯的最大保存期限比较短,不会超越几天。当用户拜访网站时,咱们的 jQuery 脚本将异步获取表中的一切音讯,并经过在操控器上调用可回来 JavaScript Object Notation (JSON) 的办法在浏览器中以常见的方式显现这些音讯。
虽然行列只处理字符串或字节数组,但咱们能够经过将任何类型的结构化数据序列化为二进制文件来将其存储在行列中,然后在咱们需求运用时再将其转化回来。这成为将强类型化的目标传递到行列中的超卓技能。咱们会将此技能构建到咱们的行列音讯的基类中。然后,咱们的体系音讯类能够包括咱们的数据,并且能够将整个目标提交到行列中并根据需求进行运用(请参见图 2)。
图 2 在行列中存储结构化数据
namespace HollywoodHackers.Storage.Queue
{
[Serializable]
public class QueueMessageBase
{
public byte[] ToBinary()
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
ms.Position = 0;
bf.Serialize(ms, this);
byte[] output = ms.GetBuffer();
ms.Close();
return output;
}
public static T FromMessageT>(CloudQueueMessage m)
{
byte[] buffer = m.AsBytes();
MemoryStream ms = new MemoryStream(buffer);
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
return (T)bf.Deserialize(ms);
}
}
[Serializable]
public class ToastQueueMessage : QueueMessageBase
{
public ToastQueueMessage()
: base()
{
}
public string TargetUserName { get; set; }
public string MessageText { get; set; }
public string Title { get; set; }
public DateTime CreatedOn { get; set; }
}
请记住,要运用 BinaryFormatter 类,需求以彻底信赖形式(能够经过服务配置文件启用此形式)运转 Windows Azure 工作者人物。