【问题标题】:Scheduling jobs on both a Cloud and Local installation在云和本地安装上安排作业
【发布时间】:2012-10-18 22:29:08
【问题描述】:

我正在开发一个有两个要求的新建项目。

  • 在云 (Azure) 中运行。
  • 在自托管的 Windows Server 安装上运行。

这个项目分为三个主要部分。

  1. 客户端集合。
  2. 一个 RESTful 服务器。
  3. 持久存储。

对于这个问题,客户端无关紧要,RESTful 服务器是使用 ASP.NET WebApi 构建的(满足上述要求),如果是云,持久存储是 Azure Tables,或者自托管时是 RavenDb。那么问题来了。

在此架构中满足上述两个要求的调度作业的最佳机制是什么。

我有一个作业的概念,它通过查询 RESTful 服务器并要求它对任何活动作业进行预定时间检查来运行,因此该服务实际上只需要进行一个非常简单的休息查询即可启动该过程。

所有作业和运行它们的逻辑(它们是模板)都在服务器上,因此服务不需要逻辑。

最终,最好的响应是某种自动收报机服务,要求该服务执行检查。如果我可以将它直接构建到 ASP.NET WebApi 服务器中,我会更开心。这是一项新技术,因此请原谅我可能遗漏的任何明显的疏忽,以解决这个问题。

【问题讨论】:

  • 你看过 Quartz.net (quartz-scheduler.net) 的调度任务吗?
  • 我还没有专门研究特定的库,因为我不确定从架构的角度来看我需要什么。我也对为我需要的内容添加 lib 依赖项持谨慎态度,这本质上是某种运行请求的代码。
  • Quartz 稳定且有大量追随者 - 但这意味着您需要自己实现所有内容。

标签: .net architecture azure self-hosting


【解决方案1】:

一种方法是编写一个非常简单的“调度程序服务”(原则上类似于 OP cmets 中提到的石英调度程序),用 [在此处插入最喜欢的 .Net 语言] 编写。

这项服务可以根据您的意愿简单或复杂;在低端,它可以简单地操作一个计时器,该计时器会以设定的时间间隔调用 REST API 来触发您的流程

服务本身可以编写为一个类库,然后当部署在 Windows Server 安装上时,该类库可以托管在 Windows 服务中;或者,在部署到云时托管在 Azure 辅助角色中。当部署在 Azure Worker Role 中时,调度程序可以在 XS 实例(1GHz CPU、768MB RAM、20GB 存储)中轻松运行,成本最低 - 当前价格为每月 14.40 美元。

这种方法允许在两种解决方案中使用相同的代码库(只需引用类库项目),并且可以进行独立的单元测试。

采用这种方法更进一步,您可以在运行时自动加载类库程序集,使未来的部署和升级非常容易。

【讨论】:

  • 啊,这似乎很容易,是的,基本上服务只需要每 5 到 10 分钟打勾,所以我认为这个想法很合适,我认为运行服务并不便宜在 azure 中,但根据四舍五入的这些成本,它是可以接受的。干杯!
  • 等一下,我只是重读了最后一部分,我什至不需要单独的工作者角色,因为在云部署的情况下,我使用 web 角色作为 webapi 我可以拥有服务在它旁边旋转。你先生是个传奇!
  • @deanvmc - 请记住:如果您在 Web 角色旁边运行调度程序服务,则需要确保只有一个调度程序实例在运行(实际上,单独的角色存在同样的问题)。当您增加 Web 角色(在您的情况下为 REST API)或工作角色(根据尼克的建议专用于调度)的实例计数时,就会出现问题。无论哪种情况:您应该只运行一个调度程序副本。您可以将 blob-lease 用作互斥锁,作为实现此目的的一种方法。
  • 干杯 @DavidMakogon 我只是在纸上解决这个问题,因为云部署的主要原因是规模!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多