Azure 函数:ICollector<T> 与 IAsyncCollector<T>
Posted
技术标签:
【中文标题】Azure 函数:ICollector<T> 与 IAsyncCollector<T>【英文标题】:Azure Functions: ICollector<T> vs IAsyncCollector<T> 【发布时间】:2017-04-05 14:07:34 【问题描述】:在编写 C# 函数(也适用于 WebJobs)时,Azure Functions 中的 ICollector<T>
和 IAsyncCollector<T>
有什么区别?
我从示例中了解到,这些接口是我可以用来将函数参数绑定到输出绑定的接口。我也了解这两个接口相应地具有非异步和异步方法签名(即ICollector<T>.Add(item)
和IAsyncCollector<T>.AddAsync(item)
)。但他们在幕后做了什么?他们是否真的将数据发布到输出绑定,还是在函数执行结束时在内部缓冲和刷新(在这种情况下,为什么要通过AddAsync
方法)?
【问题讨论】:
【参考方案1】:ICollector<T>.Add(item)
将始终立即对底层服务执行添加操作。例如。 Queue 绑定的实现将在添加消息时立即将它们排入队列。
IAsyncCollector<T>.AddAsync(item)
行为因绑定而异,具体取决于底层服务是否支持批处理。在这种情况下,AddAsync
可能只会通过相应的IAsyncCollector<T>.FlushAsync
方法实际保存添加的项目以稍后刷新。当函数成功完成时,FlushAsync
将被自动调用。您可以允许自动刷新行为为您刷新,或者您可以根据需要选择在您的函数中手动调用FlushAsync
。
批处理可以让绑定以最有效的方式与底层服务交互。例如。对于 Azure 表,可以在单个批处理操作中更新/保留多个实体。
【讨论】:
除了看起来大多数绑定不支持批处理(请参阅github.com/Azure/azure-webjobs-sdk/issues/921)。例如,ServiceBus 不批处理!以上是关于Azure 函数:ICollector<T> 与 IAsyncCollector<T>的主要内容,如果未能解决你的问题,请参考以下文章
如何在 t-sql (Azure Synapse) 的 CAST/CONVERT 中使用字符串函数
如何在 Azure 表存储中使用 partitionkey 加快查询速度
从 project.json 到 function.proj xml 的 Azure 函数转换