Azure Functions Event Hub触发器绑定

时间:2017-03-20 10:31:42

标签: azure azure-functions azure-eventhub

关于在物联网方案中使用EventHub的Azure功能的使用,我们有几个问题。

  • EventHub有分区。通常,来自特定设备的消息将转到同一分区。如何在EventHub分区中分布Azure功能的实例?它是基于性能的吗?如果Azure功能的一个实例设法处理来自所有分区的事件,那么它就足够了,否则每个EventHub分区最终会有一个Azure功能实例?
  • 读取偏移怎么样?这种绑定是否以某种方式记录它停止读取事件流的位置?我认为这些功能是无国籍的,在这里我们有一些状态。

谢谢

2 个答案:

答案 0 :(得分:12)

Event Hub-Triggered Function的每个实例仅由1个EventProcessorHost(EPH)实例支持。事件中心确保只有1个EPH可以在给定分区上获得租约。

回答问题1: 让我们用一个人为的例子详细说明这一点。假设我们从EventHub的以下设置和假设开始:

  1. 10个分区。
  2. 在所有分区上均匀分布的1000个事件=>每个分区中有100条消息。
  3. 首次启用函数时,只有1个函数实例。让我们调用这个Function实例 Function_0 Function_0 将拥有1个EPH,可以在所有10个分区上获得租约。让这个EPH被称为 EPH_0 ,它将开始从分区0-9读取事件。从现在开始,将发生以下其中一种情况:

    1. 只需要1个函数实例 - Function_0 能够在Azure Functions'之前处理所有1000个缩放逻辑开始。 因此,所有1000条消息都由 Function_0 处理。

    2. 再添加一个功能实例 - Azure功能'缩放逻辑确定 Function_0 看起来很迟钝,因此是一个新实例 创建 Function_1 ,生成 EPH_1 。事件中心检测到新的EPH实例正在尝试读取消息。 Event Hub将开始加载 平衡EPH实例上的分区,例如分区 0-4分配给 EPH_0 ,分区5-9分配给 EPH_1

      如果所有功能执行成功且没有错误,则 EPH_0 EPH_1 检查点已成功完成并处理了所有1000条消息。当检查指向成功时,永远不应再次检索所有1000条消息。

    3. 添加N个更多功能实例 - Azure功能'缩放逻辑确定 Function_0 Function_1 仍然缓慢且 将再次为 Function_2 ... N 重复工作流程2,其中N> 9。 Event Hub将在 Function_0 ... 9 实例之间对分区进行负载平衡
      Azure功能的独特功能'当前缩放逻辑是N >(分区数)的事实。这样做是为了确保 总有很多EPH可以快速获得 锁定分区。作为客户,您只需为Function实例执行时使用的资源付费,但您不需要为此过度配置付费。

    4. 回答问题2: EPH使用检查指向机制来标记最后已知的成功读取消息。可以将EventHub-Triggered功能设置为一次处理1条消息或一批消息。您选择的选项需要考虑以下因素:

      <强> 1。消息处理的速度 - 一次处理消息而不是单个消息 的因素之一将加快Azure功能工作流程跟上传入的速度您的事件中心中的消息。

      <强> 2。重复容差 - 如果由于功能代码中的错误导致检查指向失败/ (2017年8月24日更新)超时/分区最少丢失,那么下一个获得租约的EPH该分区将开始从上一个已知检查点检索消息。 Event Hub保证至少一次投放,但不保证最多一次投放。 Azure Functions不会尝试更改该行为。如果没有重复消息是优先事项,那么您需要在工作流程中缓解它。因此,当检查指向失败时,如果您的函数正在批处理级别处理消息,则需要管理更多重复消息。

答案 1 :(得分:2)

功能应用程序基于WebJobs SDK,它使用EventHostProcessor来使用事件中心的事件。因此,您可以查找有关EventHostProcessor的信息,它将适用于您的功能应用程序。

特别是,你可以找到IEventProcessor的实现 here

问题:

  1. 不确定你的意思&#34;一个实例&#34;。每个分区将创建一个侦听器,但如果负载较低,则可以将它们托管在单个应用程序计划实例中。在高层次上,您不应该太在意:在消费计划中,无论运行多少台服务器/进程/线程,您都需要按执行时间付费。当然,你应该关心自动缩放对于高负载是否足够好,但是无论如何都需要进行测试。

  2. 在某种意义上,函数是无状态的,您无法在两个函数执行之间保存内存中的任何内容。在外部存储中保存状态完全没问题。功能应用程序将使用PartitionContext.CheckpointAsync()来检查当前偏移量。 Azure存储在内部使用;您可以再次详细了解它在事件中心和EventHostProcessor文档中的工作原理,例如: here