2

我有一个工作角色,每 X 小时执行一次代码(获取数据并将其存储到 Azure SQL)。计时是在 Run 方法的 while(true) 循环中使用 Thread.Sleep 实现的。

在 Web 角色中,我希望能够手动启动 Worker Role 中的代码(在我的情况下手动 fecth 并存储数据)。我发现可以使用 Azure 管理 API 重新启动整个 Worker 角色,但这似乎有点过头了,特别是查看证书所需的所有工作。

有没有更好的方法从 Web 角色重新启动 Worker 角色,或者让 Worker 角色中的代码按需从 Web 角色运行?

4

2 回答 2

1

好吧,我建议您使用 Azure Fluent Management(它在内部使用服务管理 API)。查看“部署到 Windows Azure ”页面。

您将要执行以下操作:

  • 云服务:mywebapp.cloudapp.net
    • 生产槽
      • 角色:MyMvcApplication
  • 云服务:mybackgroundworker.cloudapp.net
    • 生产槽
      • 没有部署

因此,您通常会使用 Web 角色运行云服务,仅此而已。您接下来要做的是创建 Worker 角色、添加代码、将其打包到 cspkg 文件并将其上传到 blob 存储。

最后,您的 Web 角色中会有一些代码,可以通过在本地下载包然后运行类似于以下的代码来将 Worker 角色部署(或删除)到其他云服务:

 var subscriptionManager = new SubscriptionManager(TestConstants.SubscriptionId);
 var deploymentManager = subscriptionManager.GetDeploymentManager();

 deploymentManager
       .AddCertificateFromStore(Constants.Thumbprint)
       .ForNewDeployment(TestConstants.HostedServiceName)
       .SetCspkgEndpoint(@"C:\mypackage")
       .WithNewHostedService("myelastatestservice")
       .WithStorageAccount("account")
       .AddDescription("my new service")
       .AddLocation(LocationConstants.NorthEurope)
       .GoHostedServiceDeployment();
于 2013-01-23T15:36:50.297 回答
1

将事件发布到 Azure 队列、将 blob 发布到 Azure Blob、更改 Azure 表中的记录甚至在 SQL Azure 中进行一些更改之类的任何操作都将起作用 - Web 角色将执行更改,而辅助角色将等待该更改. 也许 Azure Queues 将是最干净的方式,尽管我不确定。

您应该注意的一件非常重要的事情是,如果您决定使用轮询 - 例如查询 blob 直到它出现 - 您应该在查询之间插入延迟,否则此代码:

while( true ) {
   if( storage.BlobExists( blobName ) ) {
       break;
   }
}

会冲进存储,你会遇到离谱的交易费用。在 SQL Azure 的情况下,您不会看到任何费用,但您会浪费服务容量,这将减慢您排队到 SQL Azure 的其他操作。

这是应该如何做的:

while( true ) {
   if( storage.BlobExists( blobName ) ) {
       break;
   }
   // value should not be less that several hundred (milliseconds)
   System.Threading.Thread.Sleep( 15 * 1000 );
}
于 2013-01-24T07:43:39.720 回答