事件集线器触发函数的每个实例仅由1个EventProcessorHost(EPH)实例支持。事件中心确保只有1个EPH可以在给定分区上获得租约。
对问题1的回答: 让我们用一个人为的例子来说明这一点。假设我们从EventHub的以下设置和假设开始:
- 10个分区。
- 1000个事件在每个分区中均匀地分布在所有的分区=> 100个消息。
当第一次启用了功能,只有1功能的实例。我们称之为函数实例Function_0。 Function_0将有1个EPH,它可以在所有10个分区上获得租约。让这个EPH被称为EPH_0,它将开始从分区0-9读取事件。从这点出发,下面的人会发生:需要
只有1功能实例 -Function_0能够在Azure的功能缩放逻辑踢之前处理所有1000 因此,所有1000条消息都由Function_0处理。
添加1更Function实例 -天青函数缩放逻辑确定Function_0似乎迟缓,所以一个新的实例被创建 Function_1,导致EPH_1。 Event Hub检测到新的EPH实例正在尝试读取消息。事件集线器将开始加载 平衡跨EPH实例的分区,例如,分区 0-4被分配给EPH_0并且分区5-9被分配给EPH_1。
如果所有功能的执行没有错误成功,既EPH_0和 EPH_1成功闯关,所有1000消息进行处理。当检查指向成功时,不应再次检索所有1000条消息。
添加N多功能实例 -天青函数缩放逻辑确定两个Function_0和Function_1仍然迟缓和 将再次重复工作流程2 Function_2 ... N,其中N> 9。事件中心将通过Function_0 ... 9实例负载均衡分区。
Azure的特有功能的当前缩放逻辑是N为>(分区数)。这样做的目的是为了确保 总是有EPH实例随时可用以快速获得对分区的锁定。作为客户,您只需为您的Function实例执行时使用的资源收费,但您不会因此过度配置而收取费用。
回答问题2: EPH使用检查点机制,以纪念最后一次成功读取消息。 EventHub触发的功能可以设置为一次处理1条消息或一批消息。您选择需要的选项要考虑以下几点:
1.消息处理的速度 - 分批的,而不是在一个时间一个消息处理的消息是,这将加速能力的因素一个你Azure Function工作流程可跟上Event Hub中的传入消息。
2.容忍重复 -如果检查点失败在你的功能代码由于
错误/
(更新2017年8月24日)暂停/分区至少丢失了,那么接下来的EPH即获得对租赁分区将开始检索最后一个已知检查点的消息。活动中心保证至少一次送达,但不送达最多送达。 Azure函数不会尝试更改该行为。如果没有重复邮件是一个优先事项,那么您需要在工作流程中缓解它。因此,当check-pointing失败时,如果您的Function正在批处理级别处理消息,则需要管理更多重复消息。
哇,非常感谢这个伟大的详细解释。对此,我真的非常感激! – Helikaon
我看到您可以为事件中心触发器指定使用者组,但不能为检查点指定至少一个名称。它是否会自动在azure函数的所有实例中使用相同的租用名称以确保不会多次处理消息? – Dan
Dan,目前,在支持每个Function实例的EPH实例的实例化时未指定租用名称。 EventHub不保证一次交付。您需要在下游工作流程中进行重复数据删除。 –