安排多个相互依赖的SQL Server代理作业的做法是什么



我的团队当前安排作业的方式是通过SQL Server作业代理。这些作业中的许多都依赖于其他内部服务器,而其他内部服务器又有自己的SQL Server作业,需要运行这些作业才能使其数据保持最新。

这在每个SQL Server作业的开始时间和长度上都产生了依赖关系。作业A可能取决于作业B的完成,因此我们将作业B提前安排到作业A的某个估计时间。所有这些过程都是非常主观的,并且不可扩展,因为我们添加了更多的作业和服务器,从而产生了更多的依赖性。

我很想摆脱主观地安排这些工作,并希望多米诺骨牌按正确的顺序排列。我想知道调度SQL Server作业的公认做法是什么。人们是否使用SSIS将作业链接在一起?SQL Server作业代理中是否已经内置了处理此问题的工具?

处理相互依赖的多个SQL Server作业的调度的公认方法是什么?

我以前曾使用Control-M在不同的环境中调度多个相互依赖的作业。Control-M通常通过使用批处理文件(据我所知)来执行SSIS包。

我们有一个复杂的环境,同时托管2个数据仓库(1个国际数据仓库和1个美国本地数据仓库)。有些作业依赖于其他作业,这些作业依赖于他人等等,但通过使用Control-M,我们可以很容易地决定依赖性(它有一个非常好且直观的GUI)。我想到的另一个工具是Tidal Scheduler。

工作安排没有固定的标准,但我认为可以肯定地说,工作安排完全取决于组织的需求。例如,财务工作可能依赖于销售和库存销售等等。但关键是,如果你需要工作的相互依赖性,使用Control-M等第三方软件是一个安全的选择。它可以控制不同环境中的工作,让你真正感受到全公司的工作控制。

我们也需要管理多个代理作业之间的依赖关系-在查看了各种第三方工具并出于各种原因对其进行了折扣后(主要是由于与使用第三方软件有关的内部限制),我们决定创建自己的解决方案。

该解决方案以配置数据库为中心,该数据库包含需要运行的进程(作业)的详细信息以及如何对它们进行分组(批处理),以及进程之间的依赖关系。

使用的配置表摘要:

批处理-一组相关进程的高级定义,包括最大并发进程和当前批处理实例等元数据。进程-与进程(作业)相关的元数据,如名称、最长等待时间、最早运行时间、状态(启用/禁用)、批次(进程属于哪个批次)、进程作业名称等。批次实例-给定批次的活动实例进程实例-给定批次的进程的活动实例流程相关性-相关性矩阵批次实例状态-查找批次实例状态进程实例状态-进程实例状态的loolup

每个批次有2个控制作业-START batch和UPDATE batch。第一个处理启动属于它的所有进程,第二个是最后一个在任何给定批次中运行的进程,并处理更新结果状态。

每个进程都有一个关联的代理作业,由START BATCH作业执行-进程有一个上限并发性(在批处理配置中定义),因此进程一次最多启动x个,然后START BATCH等待,直到有空闲插槽可用,然后再启动下一个进程。

流程代理作业步骤调用一个模板化SSIS包,该包处理实际的ETL工作,并决定流程是否需要运行以及是否必须等待依赖关系等。

我们目前正在寻求转向Service Broker解决方案,以获得更大的灵活性和控制能力。

无论如何,这里可能有太多的细节和不够的例子,所以VS2010项目可根据要求提供。

我不确定这会有多大帮助,但我们最终创建了一个用于日程安排的电子邮件解决方案。

我们构建了一个访问exchange邮箱的电子邮件阅读器。作业完成后,他们会向邮件阅读器发送一封电子邮件,开始另一项作业。另一个好的部分是,大多数应用程序都内置了电子邮件通知,所以实际上没有太多的自定义编程。

实际上,我们最初只是为了处理来自许多其他合作伙伴的数据文件而构建的。给他们一个电子邮件地址比给他们设置ftp网站等要容易得多。

邮件阅读器应用程序现在已经发展到包括基本过滤、一天中的时间安排、使用信号量来防止并发作业等。它真的很好用。

最新更新