视频编码的示例

Durable Task Framework 视频编码的示例

https://github.com/Azure/durabletask/wiki/Example---Video-Encoding

假设用户希望建立一个代码协调,对视频进行编码,然后在编码完成后向用户发送电子邮件。

为了使用服务总线持久任务框架实现这一目标,用户将编写两个任务活动,分别用于编码视频和发送电子邮件,以及一个任务协调,在这两个活动之间进行协调。

public class EncodeVideoOrchestration : TaskOrchestration<string, string>
{
    public override async Task<string> RunTask(OrchestrationContext context, 
                                                 string input)
    {
        string encodedUrl = 
              await context.ScheduleTask<string>(typeof (EncodeActivity), input);
        await context.ScheduleTask<object>(typeof (EmailActivity), input);
        return encodedUrl;
    }
}

在此协调中,用户调度编码视频活动,等待响应,然后调度发送电子邮件活动。框架将确保持久保存执行状态。例如,如果托管上述任务协调的节点在调度编码视频活动之前崩溃,那么重启时它就会知道要调度该活动。如果节点在调度完活动后但在收到响应前崩溃,重启时它就会聪明地知道该活动已被调度,并直接开始等待 EncodeVideo 活动的响应。

public class EncodeActivity : TaskActivity<string, string>
{
    protected override string Execute(TaskContext context, string input)
    {
        Console.WriteLine("Encoding video " + input);
        // TODO : actually encode the video to a destination
        return "http://<azurebloblocation>/encoded_video.avi";
    }
}

public class EmailActivity : TaskActivity<string, object>
{
    protected override object Execute(TaskContext context, string input)
    {
        // TODO : actually send email to user
        return null;
    }
}

上述用户代码(EncodeVideoOrchestration、EncodeActivity 和 EmailActivity)需要在某个地方托管和可用才能发挥作用。

这样,用户才能在 Worker 中加载这些协调和活动类,并开始处理请求以创建新的协调实例。

string serviceBusConnString = "Endpoint=sb://<namespace>.servicebus.windows.net/;SharedSecretIssuer=[issuer];SharedSecretValue=[value]";

TaskHubWorker hubWorker = new TaskHubWorker("myvideohub", serviceBusConnString)
    .AddTaskOrchestrations(typeof (EncodeVideoOrchestration))
    .AddTaskActivities(typeof (EncodeActivity), typeof (EmailActivity))
    .Start();

这些 Worker 的多个实例可针对同一个任务中心同时运行,以根据需要提供负载平衡。该框架保证特定的协调实例代码在同一时间只能在单个 Worker 上执行。

TaskHubWorker 还提供了停止 Worker 实例的方法。

最后剩下的部分是创建和管理协调实例,即如何实际触发用户加载的代码协调,以及如何监控或终止它们。

string serviceBusConnString = "Endpoint=sb://<namespace>.servicebus.windows.net/;SharedSecretIssuer=[issuer];SharedSecretValue=[value]";

TaskHubClient client = new TaskHubClient("myvideohub", serviceBusConnString);
client.CreateOrchestrationInstance(typeof (EncodeVideoOrchestration), "http://<azurebloblocation>/MyVideo.mpg");