Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时不在Azure函数ServiceBus绑定中的IAsyncCollector上调用FlushAsync_Azure_Azure Functions_Azureservicebus - Fatal编程技术网

何时不在Azure函数ServiceBus绑定中的IAsyncCollector上调用FlushAsync

何时不在Azure函数ServiceBus绑定中的IAsyncCollector上调用FlushAsync,azure,azure-functions,azureservicebus,Azure,Azure Functions,Azureservicebus,我有一系列Azure功能应用程序,所有这些应用程序都使用IAsyncCollector将消息输出到Azure服务总线: 公共异步任务运行([ServiceBus(…)]IAsyncCollector消息) { ... 等待消息。AddAsync(msg); } 我会不时记录错误,如下所示: Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行function:function时发生异常 --->Microsoft.Azure.S

我有一系列Azure功能应用程序,所有这些应用程序都使用
IAsyncCollector
将消息输出到Azure服务总线:

公共异步任务运行([ServiceBus(…)]IAsyncCollector消息)
{
...
等待消息。AddAsync(msg);
}
我会不时记录错误,如下所示:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行function:function时发生异常
--->Microsoft.Azure.ServiceBus.ServiceBusTimeoutException:操作未在对象消息的分配时间00:00:59.9999536内完成。参考:…,7/13/2020 2:46:24 PM
--->System.TimeoutException:操作未在为对象消息分配的时间00:00:59.9999536内完成。
在Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult](IAsyncResult结果)
在Microsoft.Azure.Amqp.SendingAmqpLink.EndSendMessage上(IAsyncResult结果)
在System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar、Func`2 endFunction、Action`1 endAction、Task`1 Promission、Boolean requiresSynchronization)
---来自引发异常的上一个位置的堆栈结束跟踪---
位于Microsoft.Azure.ServiceBus.Core.MessageSender.OnSendAsync(IList`1 messageList)
---内部异常堆栈跟踪的结束---
位于Microsoft.Azure.ServiceBus.Core.MessageSender.OnSendAsync(IList`1 messageList)
在Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1操作,TimeSpan操作超时)
在Microsoft.Azure.ServiceBus.RetryPolicy.RunOperation(Func`1操作,TimeSpan操作超时)
位于Microsoft.Azure.ServiceBus.Core.MessageSender.SendAsync(IList`1 messageList)
位于Microsoft.Azure.WebJobs.ServiceBus.Bindings.MessageSenderExtensions.SendAndCreateEntityIfNotExists(MessageSender-sender,Message-Message,Guid函数InstanceId,EntityType-EntityType,CancellationToken-CancellationToken)
在My.Function.Run(字符串mySbMsg,IAsyncCollector`1消息)
我很难弄清楚这是什么时候发生的。但我最近了解了
FlushAsync
方法:

wait messages.AddAsync(msg);
等待消息。FlushAsync();
我的问题如下。为什么我永远不会在函数中包含对
FlushAsync
的调用?在我自己的代码中获取超时异常将使重试、更好地记录异常等成为可能。在功能代码中,像这样手动刷新有什么缺点吗

为什么我永远不会在函数中包含对FlushAsync的调用?在我自己的代码中获取超时异常将使重试、更好地记录异常等成为可能

我将在这里进一步说明,在我获得了一些Azure函数的经验之后,我现在完全避免使用
IAsyncCollector
。一些实现在
AddAsync
上发布;其他实现可以在
AddAsync
FlushAsync
上发布。我怀疑服务总线实现实际上是在
AddAsync
上发布的,在这种情况下
FlushAsync
可能是一个noop

IAsyncCollector
的好处在于它为您提供了一个“编写这些东西”的抽象;你所要做的就是提供一个连接字符串,剩下的就是魔术。
IAsyncCollector
的问题是,它给了您一个抽象,因此您的控制力要小得多

在引擎盖下,有多少次重试?他们使用的是常数延迟还是指数增长?如果它永远不会成功,那会是什么行为?通常这些关键信息都没有记录在案

尤其恼人的是当AF团队更改抽象的语义时。例如,对于某些输出绑定(CosmosDB或storage,我不记得了),重试行为从一个版本的functions SDK更改为下一个版本

因此,我倾向于避免输出绑定,尤其是
IAsyncCollector
。我通常希望在一分钟左右的时间内执行严格但呈指数级增加的去相关抖动重试,但在函数运行时间只剩下一分钟时中止,然后恢复行为将更改为将消息写入错误队列(重试)。这比
IAsyncCollector
所能提供的要复杂得多,但Polly直接调用SDK也不难做到

在功能代码中,像这样手动刷新有什么缺点吗


否。默认情况下,
IAsyncCollector.FlushAsync
在函数执行后由函数主机调用。所以如果你自己打电话,你只是提前打电话。多次调用应该是安全的。

在代码中调用
FlushAsync
没有什么问题。ServiceBus输出绑定的
IAsyncCollector
的当前实现是对消息进行批处理,直到调用
FlushAsync
或函数返回。在尝试发送大量消息时,我偶然发现了与您相同的超时异常。我找到的解决方案是每隔N条消息调用
FlushAsync
,在我的例子中,
N=100
是最好的折衷方案。过于频繁地调用FlushAsync会导致明显的性能损失。

实际上,这是一个很好的建议。像重试这样的特性是我很难弄清楚每个绑定中是否包含的。有时我甚至会遇到这样的情况:我在Polly中包装了一个重试呼叫,导致了太多的重试。@ThomasArdal在Polly中的重试呼叫示例?请使用一个新问题询问如何使用Polly。下面是一个悬而未决的问题