Azure Eventhub/事件处理器主机:分区未按预期工作

Azure Eventhub / Event Processor Host: Partitioning not working as predicted

我们目前正在开展一个项目,该项目实施并使用 Azure Eventhub。 我们使用事件处理器主机来处理来自 Eventhub 的数据。我们有 32 个分区分布在 3 个节点上,并且想知道事件处理器主机如何将分区分布和平衡到接收器/节点上——尤其是在使用分区键时。

我们目前有 4 个不同的客户(蓝色、橙色、紫色和浅蓝色)向我们发送不同大小的数据。如您所见,左侧的蓝色客户发送了大约132k串数据,而右边浅蓝色客户只发送了28串。 我们的理论是,给定一个基于客户(颜色标识)的分区键,我们会看到客户数据只会放在一个节点中。 相反,我们可以看到数据以某种方式均匀分布在 3 个节点上,如下所示:

节点 1:

节点 2:

节点 3:

关于分区键的使用方式,我们是否误解了什么?从我们在文档中读到的内容来看,当我们不指定分区键时,将使用“循环”方法——但即使使用分区键,它也会以某种方式平均分配它们。 我们是否以某种方式对节点施加了压力——一个蓝色客户拥有大量数据而另一个客户几乎什么都没有?或者是怎么回事?

为了形象化我们的理论,我们绘制了以下内容:

那我们是不是给顶层节点压一个蓝客户,到头来还得往中间节点移动一个partition?

当您想确保将一组事件路由到同一分区,但又不想分配显式分区时,可以使用分区键。简而言之,分区键的使用是控制路由的明确请求,并防止服务跨分区平衡。

当您指定分区键时,它用于生成哈希值,事件中心服务使用该哈希值分配事件将路由到的分区。使用相同分区键的每个事件都将发布到同一分区。

要在发布时允许服务循环,您不能指定分区键或显式分区标识符。

Jesse 已经解释了分区键的用途,所以我不再重复。

如果您希望客户与消费者节点具有亲和力,您应该考虑为每个客户提供一个独立的事件中心,这样您就可以告诉您的系统类似

  1. node-1 仅通过消费来自 eventhub-1 的事件来处理来自 customerA 的数据

  2. node-2仅通过消费来自eventhub-2的事件来处理来自customerB的数据 等等...

使用分区键并不能真正解决您的业务逻辑问题。

还有一件事。如果您计划 运行 将来有更多的客户,那么您还需要考虑扩展您的设计,以在客户和 EH 命名空间之间建立亲和力。