8

我正在开发一个 ASP.NET 应用程序,它将被上传到 Azure。如果我在 Azure 上有多个实例,并且我想运行我的应用程序所必需的 cron 作业。然后,我只想确认该 cron 作业是否只运行一次,或者每个实例将自行运行该 cron?

例如:如果我在 Azure 上有 4 个云服务实例,并且我的应用程序每天晚上 11:00 运行一个 cron 作业。所以,我只想确认该 cron 是否将只运行一次,或者每个实例将自行运行该 cron(即 cron 将运行 4 次,或者我们可以说每个实例运行一次)?

请建议。

4

4 回答 4

4

到目前为止,我已经找到了 3 种执行 cron 作业的方法,但它们都需要在一定程度上管理可能运行任务的多个实例。

到目前为止我使用的选择:

  1. Windows 任务计划程序 - 创建一个启动脚本,添加用户并为其安排任务。此处的更多信息:以真实用户身份运行 Azure 启动任务和此处:在 Windows Azure 中构建任务计划程序

  2. 使用 Quartz.Net - 这是我开始使用的,但后来转移到 Windows 任务调度程序,但它可能对您有用,因为您可以更轻松地自定义内容。更多信息在这里:使用 Quartz.net 在 Windows.Azure 工作角色中安排作业

  3. 在移动服务中使用新的作业调度程序。我没有使用过这个,但是当我阅读这篇博客时:去年年底在 Windows Azure 中的作业调度我把它放在了我的心理清单上,以便下次我需要一个作业调度器时看看。它仍然有点新,但它也可能对您有所帮助。

于 2013-04-06T11:35:14.930 回答
3

在您的示例中,所有 4 个实例都将尝试运行 cron 作业。如果您只想让一个实例运行该作业,则需要实现某种“锁定”机制。通常人们所做的是每个实例都会尝试在同一个 blob 上获得 1 分钟的租约。只有一个实例会成功获得租约。您可以设置只有能够获取租约的实例才执行该 cron 作业的逻辑。

于 2013-04-06T11:26:24.517 回答
1

正如其他用户所说,有很多方法可以做到这一点。我补充几点建议。您是否开发了 Cloude 服务 Web 角色或网站。如果是前者,最简单的方法是创建 1 个工作角色(只有一个)并从那里运行任务。对于后者,您需要一个外部“触发器”:您可以使用调度程序(由 Aditi 提供)。您可以从 Azure 商店获得它(有一个免费的 flan)。

于 2013-04-06T13:09:31.947 回答
0

如果一个角色(Web/Worker/VM 角色)有多个实例,则意味着您拥有相同的 Windows Server VM 帐户(版本取决于您配置的来宾操作系统版本)。每个 VM 将运行与您的应用程序完全相同的代码(如 ASP.NET Web 应用程序),对这个角色的所有请求都将进行负载平衡,其中一个 VM 将根据循环策略切断请求。

因此,如果您的 cron 作业只需​​要运行一次,正如 Guarav 所说,您需要一些锁定机制来让您的角色实例之一运行它。

于 2013-04-06T13:28:34.890 回答