我正在开发一个ASP.NET应用程序,该应用程序将上传到Azure上。如果我在 Azure 上有多个实例,并且我想运行我的应用程序所需的 cron 作业。然后,我只是想确认该 cron 作业是否只运行一次,还是每个实例都单独运行该 cron?
例如:如果我在 Azure 上有 4 个云服务实例,并且我的应用程序每天晚上 11:00 运行一个 cron 作业。所以,我只是想确认该 cron 是否只会运行一次,还是每个实例都会单独运行该 cron(即 cron 将运行 4 次,或者我们可以说每个实例运行一次)?
请推荐。
到目前为止,我已经找到了 3 种执行 cron 作业的方法,但它们都需要一定程度的管理可能运行任务的多个实例。
到目前为止我使用过的选择:
Windows 任务计划程序 - 创建一个启动脚本,添加用户并安排其任务。 更多信息请参见此处:以真实用户身份运行 Azure 启动任务以及此处:在 Windows Azure 中构建任务计划程序
使用 Quartz.Net - 这是我开始的,但后来转移到 Windows 任务计划程序,但它可能对您有用,因为您可以更轻松地自定义内容。 更多信息请参见:Using Quartz.net to Schedule Jobs in Windows.Azure Worker Roles
使用移动服务中的新作业调度程序。 我还没有使用过这个,但是当我去年年底读到这个博客:Windows Azure 中的作业调度时,我把它放在我的心里清单上,以便下次我需要作业调度程序时查看。 虽然还是有点新,但也可能对你有帮助。
在您的示例中,所有 4 个实例都将尝试运行 cron 作业。如果您只想让一个实例运行该作业,则需要实现某种“锁定”机制。人们通常做的是每个实例都会尝试在同一个 blob 上获取 1 分钟的租约。只有一个实例能够成功获得租约。您可以将逻辑设置为只有能够获取租约的实例才能执行该 cron 作业。
正如其他用户所说,有很多方法可以做到这一点。我添加一些建议。您是否开发了 Cloude 服务 Web 角色或网站。如果是前者,最简单的方法是同时创建 1 个辅助角色(仅一个)并从那里运行任务。如果是后者,您需要一个外部“触发器”:您可以使用 Scheduler(由 Aditi 提供)。您可以从 Azure 商店获取它(有免费的馅饼)。
如果一个角色(Web/Worker/VM 角色)有多个实例,则意味着您拥有相同的 Windows Server VM 帐户(版本取决于您配置的来宾操作系统版本)。每个虚拟机将运行与您的应用程序完全相同的代码(例如 ASP.NET Web 应用程序),对此角色的所有请求都将进行负载平衡,并且其中一个虚拟机将根据循环策略切断请求。
因此,如果您的 cron 作业只需运行一次,正如 Guarav 所说,您需要一些锁定机制来让您的角色实例之一运行它。
Azure 中的所有实例都将运行 cron 作业。就我而言,分段时间的差异是一毫秒。因此,即使只允许 1 个实例运行 Cron 作业的锁定机制也很棘手。
我所做的是我的数据库中有一个标志来保存类似 isRunning == false 这是主锁
然后我设置一个随机时间线程睡眠值,以便每个实例都会“睡眠”一段随机时间。具有最低随机值/时间的实例将开始运行 cron 作业,其他实例将已经获得 isRunning == true,因此它们不会继续