2017-03-20 41 views
0

关于在物联网场景中使用带有EventHub的Azure函数,只是有几个问题。Azure函数事件中心触发器绑定

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

感谢

回答

0

功能应用都是基于WebJobs SDK,它使用EventHostProcessor消耗从事件集线器的事件。所以你可以查询关于EventHostProcessor的信息,它将适用于你的功能应用程序。

特别是,你可以找到执行IEventProcessor here

您的问题:

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

  2. 函数是无状态的,您无法在两次函数执行之间保存任何内存。你完全可以在外部存储中保存状态。 Function App将使用PartitionContext.CheckpointAsync()来检查当前的偏移量。 Azure存储在内部使用;再次您可以阅读更多关于它如何在事件中心和EventHostProcessor文档中工作的信息。 here

8

事件集线器触发函数的每个实例仅由1个EventProcessorHost(EPH)实例支持。事件中心确保只有1个EPH可以在给定分区上获得租约。

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

  1. 10个分区。
  2. 1000个事件在每个分区中均匀地分布在所有的分区=> 100个消息。

当第一次启用了功能,只有1功能的实例。我们称之为函数实例Function_0Function_0将有1个EPH,它可以在所有10个分区上获得租约。让这个EPH被称为EPH_0,它将开始从分区0-9读取事件。从这点出发,下面的人会发生:需要

  1. 只有1功能实例 -Function_0能够在Azure的功能缩放逻辑踢之前处理所有1000 因此,所有1000条消息都由Function_0处理。

  2. 添加1更Function实例 -天青函数缩放逻辑确定Function_0似乎迟缓,所以一个新的实例被创建 Function_1,导致EPH_1。 Event Hub检测到新的EPH实例正在尝试读取消息。事件集线器将开始加载 平衡跨EPH实例的分区,例如,分区 0-4被分配给EPH_0并且分区5-9被分配给EPH_1

    如果所有功能的执行没有错误成功,既EPH_0EPH_1成功闯关,所有1000消息进行处理。当检查指向成功时,不应再次检索所有1000条消息。

  3. 添加N多功能实例 -天青函数缩放逻辑确定两个Function_0Function_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正在批处理级别处理消息,则需要管理更多重复消息。

+0

哇,非常感谢这个伟大的详细解释。对此,我真的非常感激! – Helikaon

+0

我看到您可以为事件中心触发器指定使用者组,但不能为检查点指定至少一个名称。它是否会自动在azure函数的所有实例中使用相同的租用名称以确保不会多次处理消息? – Dan

+0

Dan,目前,在支持每个Function实例的EPH实例的实例化时未指定租用名称。 EventHub不保证一次交付。您需要在下游工作流程中进行重复数据删除。 –

-1

灵TOH,

你能告诉我们如何建立一个EventHub触发的功能,在一次处理一批消息?

+0

理想情况下,发布在自己的问题。以下是一个在javascript中显示批处理的示例:https://github.com/Azure/azure-webjobs-sdk-script/tree/dev/sample/EventHubTrigger –