首页 文章

从Web角色重新启动Azure辅助角色

提问于
浏览
2

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

在Web角色中,我希望能够手动启动Worker Role中的代码(在我的案例中手工制作和存储数据) . 我发现可以使用Azure Management API重新启动整个Worker角色,但这似乎是一种过度杀伤,特别是在查看证书所需的所有工作时 .

是否有更好的方法从Web角色重新启动辅助角色,或者是否可以按Web角色按需运行辅助角色?

2 回答

  • 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”页面 .

    你想要做的是以下内容:

    • Cloud 服务:mywebapp.cloudapp.net

    • 生产环境 槽

    • 角色:MyMvcApplication

    • Cloud 服务:mybackgroundworker.cloudapp.net

    • 生产环境 槽

    • No DEPLOYMENT

    因此,您通常会使用Web角色运行Cloud Service,就是这样 . 您接下来要做的是创建工作者角色,添加代码,将其打包到cspkg文件并将其上载到blob存储 .

    最后,您可以在Web角色中使用一些代码,通过在本地下载软件包然后运行与此类似的代码,可以将工作者角色部署(或删除)到其他Cloud Service:

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

相关问题