我正在使用包含基于ServiceBusTrigger
的Azure函数的微服务(使用Azure Function应用程序),当将消息插入 Service Bus队列 时触发。
我正在尝试确定将输出值绑定到多个目标的最佳方法(例如CosmosDB 和 IoT中心)。该方法是否标记为异步将决定我应该如何解决此问题。
据我所知,通常使用异步功能处理输出绑定的方式是使用[return: ...]
批注;但是,在我的用例中,我需要将两个不同的值返回到两个单独的目标(例如CosmosDb和IoT中心)。我不认为这是我可以通过返回值绑定或输出变量绑定来实现的,因为您不能通过async方法使用out
参数,而可以使用{{ 1}}方法。
似乎唯一的选择(如果我走了异步路由)将是在Azure函数中手动调用SDK方法,以独立于任何输出值来调用服务。我试图避免这样做,因为将输出绑定视为首选方法。
我在创建基于[return: ...]
的全新Azure函数时发现,默认情况下未将生成的方法签名标记为ServiceBusTrigger
。
这不同于async
,后者被标记为HttpTrigger
,是开箱即用的。
有人可以帮助我了解原因吗?一种与另一种相关的缩放含义是什么?
从传统意义上来说,我理解为什么您通常将async
标记为异步;但是,我不了解为何HttpTrigger
不异步
在巩固我的输出方法之前,我需要了解这一点。
答案 0 :(得分:1)
我认为带有/不带有async
函数的模板对它们没有任何理由。并且根据您的代码,您的功能可能会更高效。
请阅读this thread,以获取有关函数中的async/await
的更多信息。
关于您的主要问题,您只需绑定到CosmosDB和IoT中心输出绑定的不同对象。
IAsyncCollector
,如文档所示using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
namespace CosmosDBSamplesV2
{
public static class WriteDocsIAsyncCollector
{
[FunctionName("WriteDocsIAsyncCollector")]
public static async Task Run(
[QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
[CosmosDB(
databaseName: "ToDoItems",
collectionName: "Items",
ConnectionStringSetting = "CosmosDBConnection")]
IAsyncCollector<ToDoItem> toDoItemsOut,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");
foreach (ToDoItem toDoItem in toDoItemsIn)
{
log.LogInformation($"Description={toDoItem.Description}");
await toDoItemsOut.AddAsync(toDoItem);
}
}
}
}
IAsyncCollector
,如文档中所示[FunctionName("EH2EH")]
public static async Task Run(
[EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
[EventHub("dest", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<string> outputEvents,
ILogger log)
{
foreach (EventData eventData in events)
{
// do some processing:
var myProcessedEvent = DoSomething(eventData);
// then send the message
await outputEvents.AddAsync(JsonConvert.SerializeObject(myProcessedEvent));
}
}