Azure Functions 的事件中心输入绑定

Event Hub input binding for Azure Functions

我有一个 Azure 函数,其中输入绑定到事件中心。

public static async Task Run(TraceWriter log, string eventHubMessage)

函数触发时,默认每次执行接收多少条消息?

是1次执行=1条消息吗?

我已阅读文档并了解您可以在函数的 host.json 文件中设置这些属性:

"eventHub": {
  // The maximum event count received per receive loop. The default is 64.
  "maxBatchSize": 64,
  // The default PrefetchCount that will be used by the underlying EventProcessorHost.
  "prefetchCount": 256
}

maxBatchSize 是否意味着我将在 1 次执行中收到 64 条消息?

默认情况下会进行 1 对 1 处理,但您也可以进行批处理。将函数的签名更改为

public static async Task Run(TraceWriter log, string[] eventHubMessages)

(如果你像我一样更改名称,也重命名绑定参数)

引用github issue.

@Mikhail 是正确的。我只想添加以下内容:

  1. 如果您使用默认的 EventHub-Trigger C# 模板,创建的函数每次执行将处理 1 条消息。

  1. 如果需要每次执行都分批处理,修改如下:

    一个。在 function.json 中,添加 属性 "cardinality":"many",如图 here

    b。在run.csx中,修改Function签名并循环处理消息,例如

    public static async Task Run(TraceWriter log, string[] eventHubMessages) { foreach(string message in eventHubMessages) { // process messages } }

  2. 您在问题中指定的 host.json 配置允许您试验正确的批量大小和预取缓冲区以满足您的工作流程的需要。

补充意见:

  1. 根据消耗计划,当前允许函数 最大 默认 5 分钟执行时间 (最多可配置 10 分钟 -- 添加于 11/ 30/2017)。您应该试验 maxBatchSizeprefetchCount 设置以确保批处理的典型执行将在时间范围内完成。

  1. prefetchCount 应该是 maxBatchSize 的 3-4 倍。

  1. 每个 Function 宿主实例都由单个 EventProcessorHost (EPH) 支持。 EPH 使用检查点机制来标记最后成功处理的消息。由于 函数代码中未捕获的异常 主机崩溃、超时或分区租约丢失,函数执行可能会提前终止,从而导致检查点不成功。当 Function 执行再次重新启动时,检索到的批处理将包含来自最后一个已知检查点的消息。为 maxBatchSize 设置一个非常高的值也意味着您必须重新处理大批量。 EventHub 保证至少一次交付,但不保证最多一次交付。 Azure Functions 不会尝试更改该行为。如果只有唯一的消息是优先考虑的,您将需要在下游工作流中处理重复数据删除。