我正在开发一个ASP.NET应用程序,它将在Azure上传。如果我在Azure上有多个实例,并且我想运行一个对我的应用程序来说必需的cron作业。然后,我只是想确认一下cron作业是否只运行一次,或者每个实例都会自己运行那个cron?
例如:如果我在Azure上有4个云服务实例,而我的应用程序每天晚上11点运行一个cron作业。所以,我只是想确认一下cron是否只运行一次,或者每个实例都会自己运行那个cron(即cron将运行4次,或者我们可以说每个实例一次)?
请建议。
答案 0 :(得分:4)
到目前为止,我已经找到了3种方法来完成cron作业,但它们都需要一定程度的管理可能运行任务的多个实例。
到目前为止我用过的选择:
Windows任务计划程序 - 创建一个启动脚本,添加用户和任务计划它。有关详情,请访问:Running Azure startup tasks as a real user此处:Building a Task Scheduler in Windows Azure
使用Quartz.Net - 我开始使用,但随后转移到了Windows任务调度程序,但它可能对您有用,因为您可以更轻松地自定义内容。更多信息请访问:Using Quartz.net to Schedule Jobs in Windows.Azure Worker Roles
在移动服务中使用新的作业调度程序。我没有使用过这个,但是当我读到这篇博客时:Job Scheduling in Windows Azure去年年底,我把它放在我的心理清单上,以便下次我需要一份工作调度员。它仍然有点新,但它也可以帮助你。
答案 1 :(得分:3)
在您的示例中,所有4个实例都将尝试运行cron作业。如果您只想让一个实例运行该作业,则需要实现某种“锁定”机制。通常人们会做的是每个实例都会尝试在同一个blob上获得1分钟的租约。只有一个实例将成功获得租约。您可以设置只有能够获取租约的实例才能执行该cron作业的逻辑。
答案 2 :(得分:1)
正如其他用户所说,有很多方法可以做到这一点。我添加了一些建议。您是否开发了Cloude服务Web角色或Web站点。如果是前者,最简单的方法是创建1个辅助角色(只有一个)并从那里运行任务。它是后者,你需要一个外部的“触发器”:你可以使用Scheduler(由Aditi提供)。你可以从Azure商店获得它(有一个免费的果酱)。
答案 3 :(得分:0)
如果角色(Web /工作人员/ VM角色)具有多个实例,则表示您拥有相同的Windows Server VM帐户(版本取决于您配置的客户操作系统版本)。每个VM将运行完全相同的应用程序代码(如ASP.NET Web应用程序),对此角色的所有请求都将进行负载平衡,其中一个VM将根据循环策略切断请求。
因此,如果您的cron作业只需要运行一次,就像Guarav所说的那样,您需要一些锁定机制来让一个角色实例运行它。