有限的任务数在Azure

时间:2018-03-16 14:40:21

标签: .net azure asynchronous ssis batch-processing

搜索适当的技术选择,最好是从MS Azure PaaS(所谓的“无服务器”),因为 需要 在Azure中运行。

问题/条件:

运行一组N个完全独立的任务,同时最多执行M个任务。

  1. 每个任务的开始都可以异步触发(基本上就是这个) 是SSIS包的开始),所以我不需要阻塞 等待。
  2. 限制同时进行的任务数量(已在上面说明)
  3. 我无法订阅任务完成的自动通知,我只能在外部明确查询该信息(来自SSISDB - 所以实际上可以通过单个查询查询所有正在运行的任务的状态)
  4. 还有一些额外的要求,例如失败时的任务重试等。
  5. 考虑到该解决方案的相关部分可以在.NET中实现,其想法不是从头开始编写整个系统(即使它可能是最简单的),而是使用一些Azure云功能。

    到目前为止,我已经研究过Azure队列/服务总线,功能,Azure批处理。但是例如我在这里看不到对Bacthes非常好的适用性,因为我的任务是异步的,它们将消耗SQL Server(SSIS)之外的计算资源。但可能我只是错了,这仍然是Azure批次的一个很好的使用场景。你能告诉smth吗?

    毕竟它可能不一定是Azure解决方案,通过一些适当的.NET技术/框架解决,并作为持久功能(或其他一些无服务器方法)部署到Azure,但这是不太理想的。

2 个答案:

答案 0 :(得分:1)

我会构建一个调用SSIS子包的SSIS“主包”。这可以满足您的所有要求:

  1. 在控制流上,为每个SSIS子包创建一个执行包任务。保持它们不被Precedence Constraints连接,它们将异步启动。

  2. 对于主程序包,设置属性Max Conncurrent Executables:https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.package.maxconcurrentexecutables.aspx

  3. 查询SSISDB SQL表以获取进度,例如https://github.com/yorek/ssis-queries

  4. 在主包中,将每个执行包任务放在For循环容器中,例如http://microsoft-ssis.blogspot.com.au/2014/06/retry-task-on-failure.html

答案 1 :(得分:0)

不确定它是否完美适合,但您可以考虑使用Service Fabric。您可以将您的作业/任务作为Service Fabric Actors运行,可以由中央服务进行管理。 这将涉及比您可能想要的更多自定义代码,但您可以实现非常复杂的方案而无需处理太多的基础结构。

我暂时发布了一个类似的解决方案:

Service fabric task queue with completion task