2013-01-23 57 views
2

我有一个工作者角色,每X小时执行一次代码(将数据提取并存储到Azure SQL)。定时是在Run方法的while(true)循环中使用Thread.Sleep实现的。从Web角色重新启动Azure Worker角色

在Web角色中,我希望能够手动启动工作角色中的代码(manualy fecth并将数据存储在我的案例中)。我发现可以使用Azure Management API重新启动整个工作者角色,但它看起来像是一个矫枉过正的工作,尤其是看着证书周围的所有工作。

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

+1

任何像张贴的事件到Azure的队列,张贴BLOB天青斑点,改变天青表的记录,甚至使在SQL Azure中的一些变化将工作 - 网络角色将进行更改,工作人员角色将等待该更改。 – sharptooth

+0

@sharptooth让您的评论成为答案,我会接受它。这很容易,我认为就足够了。 –

回答

1

什么比如将事件发布到Azure队列,将blob发布到Azure Blob,更改Azure表中的记录,甚至在SQL Azure中进行一些更改都可以工作 - Web角色将执行更改,而辅助角色将等待此更改。虽然我不确定,但Azure队列可能是最干净的方式。您应该注意

一个非常重要的事情是,如果你决定使用轮询 - 直到出现像查询一个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); 
} 
1

那么我建议你使用Azure Fluent Management(它在内部使用Service Management API)。看看“Deploying to Windows Azure”页面。

什么,你会想要做的是以下几点:

  • 云服务:mywebapp.cloudapp.net
    • 采油槽
      • 角色:MyMvcApplication
  • 云服务:mybackgroundworker.cloudapp.net
    • 采油槽
      • 不存在部署

所以,你会通常有一个云服务与Web角色上运行,就是这样。您接下来要做的是创建工作者角色,添加代码,将其打包到cspkg文件并将其上传到BLOB存储。

最后,你会在你的Web角色一些代码,可以部署(或删除)辅助角色到其他云服务由本地下载软件包,然后运行类似下面的代码:

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();