我已经设置了一个Azure函数,我希望它异步运行,因为我希望队列中有数百/数千/更多消息,这些消息将同时出列,所以我这样实现了它下面(也许有更好的方法)。或者我是否需要担心异步运行函数中的代码?
如果队列中的数千条消息同时出队,Azure 是否会处理同时运行的数千个此类函数?此Azure功能article说一次只能运行几百个
放置 try catch 语句的最佳位置在哪里?在我的逻辑周围的异步调用内部还是像我的代码一样在异步调用外部?或者说有什么关系吗?
public static class CancelEvent
{
[FunctionName("CancelEvent")]
public static async void RunAsync([ServiceBusTrigger("canceleventqueue", AccessRights.Manage, Connection = "service_bus_key")]string myQueueItem, TraceWriter log, ExecutionContext context)
{
try
{
await Task.Run(() => Processor.ProcessAsync());
}
catch(Exception ex)
{
}
}
}
public class Processor
{
public static void ProcessAsync()
{
// do the work
}
}
最佳答案
TLDR;不要将 Azure Functions 构建为异步的。
根据我最近使用 azure 函数的经验,我发现最好不要将函数构建为异步函数。
在我的情况下,我使用 ServiceBusTrigger 来接收消息,然后等待处理方法,并且感到困惑的是,当冒泡异常时,它不会在 azure 门户中显示为失败,也不会捕获Application Insights 帐户中的异常详细信息,也不会正确放弃或死信该消息。我只能通过访问存储帐户中的 files\eventlog.xml 部分来发现异常详细信息,在该部分中我会发现有关未处理异常导致功能崩溃的投诉。
我自己花了一天时间进行完整的 try/catch 和处理 message.Abandon() 和 message.Deadletter() 逻辑以及手动记录所有 AppInsights 遥测数据,我发现根本不执行异步并冒出异常(在第一次执行错误报告或处理逻辑之后)导致了我期望平台出现的所有行为。
门户中函数的“运行历史记录”正确显示了通过和失败的执行,并且捕获了所有异常详细信息。
这是一个保持 Azure 函数静态、同步和简单的警示故事。他们设计的消息处理性质应该已经足够异步了。
关于c# - 在异步 Azure 函数中捕获异常的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50885018/