我有一个Worker角色,每X小时执行一次代码(获取数据并将其存储到Azure SQL) . 使用Run方法中while(true)循环中的Thread.Sleep实现计时 .
在Web角色中,我希望能够手动启动Worker Role中的代码(在我的案例中手工制作和存储数据) . 我发现可以使用Azure Management API重新启动整个Worker角色,但这似乎是一种过度杀伤,特别是在查看证书所需的所有工作时 .
是否有更好的方法从Web角色重新启动辅助角色,或者是否可以按Web角色按需运行辅助角色?
2 回答
将事件发布到Azure队列,将blob发布到Azure Blob,更改Azure表中的记录,甚至在SQL Azure中进行一些更改都可以工作 - Web角色将执行更改,工作者角色将等待更改 . 也许Azure队列是最干净的方式,虽然我不确定 .
你应该注意的一件非常重要的事情是,如果你决定使用轮询 - 比如查询blob直到它出现 - 你应该在查询之间插入一个延迟,否则这段代码:
会急于进入仓库,你会遇到惊人的交易费用 . 在SQL Azure的情况下,您不会看到任何费用,但是您将浪费服务容量,这将减慢您排队到SQL Azure的其他操作 .
这是应该怎么做:
我建议您使用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: