我正在尝试使用Azure Functions解决方案实现文件转换.转换可能需要很长时间.因此,我不希望在呼叫服务器上等待响应.
我编写了立即返回响应的函数(表示服务可用并启动转换)并在单独的线程中运行转换.回调URL用于发送转换结果.
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, Stream srcBlob, Binder binder, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
// Get request model
var input = await req.Content.ReadAsAsync<ConvertInputModel>();
//Run convert in separate thread
Task.Run( async () => {
//Read input blob -> convert -> upload output blob
var convertResult = await ConvertAndUploadFile(input, srcBlob, binder, log);
//return result using HttpClient
SendCallback(convertResult, input.CallbackUrl);
});
//Return response immediately
return req.CreateResponse(HttpStatusCode.OK);
}
新任务破坏绑定的问题.访问params时我遇到异常.那么如何在单独的胎面上进行长时间操作呢?或者这样的解决方案完全错了?
解决方法:
Azure Functions中不推荐(或支持)此模式.特别是在消费计划中运行时,由于运行时将无法准确地管理您的功能的生命周期,并最终将关闭您的服务.
这里推荐(和广泛使用)模式之一是将此工作排队以由另一个函数处理,监听该队列,并立即将响应返回给客户端.
使用这种方法,您可以实现基本相同的事情,即实际处理将以异步方式完成,但是以可靠和有效的方式完成(如果需要,可以从自动扩展中获益,以正确处理增加的负载)
请记住,使用消费计划时,功能超时为5分钟.如果预计处理时间较长,则需要在启用了AlwaysOn的专用计划上运行您的功能.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。