具有完成任务的服务结构任务队列

时间:2017-09-24 03:16:35

标签: c# azure azure-service-fabric

我的工作可以分解为较小的任务,每个任务最多可能需要30分钟才能完成。任务完成后,必须运行清理任务。

enter image description here

每个任务都是CPU密集型操作,必须在单独的计算机上运行。

问题是我找不到办法知道所有任务何时完成。如何在Service Fabric中创建应用程序,以便在完成所有任务后,可以运行其他清理任务?

此外,我怎样才能使任何任务失败或意外关闭时,向所有工作人员发送取消信号,然后调用清理任务?

2 个答案:

答案 0 :(得分:4)

您也可以根据需要使用ServiceFabric Actors。

  • 创建一个触发执行工作的中央“JobService”(例如,承载WebApi的无状态服务)
  • 创建一个处理单个任务的“TaskActor”
    • 在ActorInterface
    • 中发布cancellationToken
  • 在“JobService”中,为每个任务指定一个唯一ID,并将其用作“ActorId”
  • 在“JobService”中,等待演员完成任务并在完成所有操作后触发清理。如果其中一个人抛出异常,你也可以取消其他演员。

您可以查看分区概念,了解演员如何在您的节点中传播。

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-platform#service-fabric-partition-concepts-for-actors

根据您的场景,actorIds可以是一致的(例如taskActor1,taskActor2)来重用资源,或者您可以使用guid使它们对每个作业都是唯一的。

答案 1 :(得分:2)

考虑使用事件驱动(或pub/sub)方法。

' start-task'可以通知预期的子任务数量。每个完成的任务都可以触发事件。清理任务可以等待启动事件和所有完成事件。清理后,如果需要,它可以通知听众。

以类似的方式,事件可以包含有关进度,失败和取消的信息。