【问题标题】:Azure Eventhub / Event Processor Host: Partitioning not working as predictedAzure Eventhub / 事件处理器主机:分区未按预期工作
【发布时间】:2020-03-11 11:22:15
【问题描述】:

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

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

节点 1:

节点 2:

节点 3:

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

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

那么我们是在用蓝色客户强调顶部节点,最终必须将分区移动到中间节点?

【问题讨论】:

  • 节点是什么意思?运行事件处理器主机的进程?
  • 您可能在这里混淆了两件事:事件中心处理器使用 Azure Blob 存储租约在不同的处理器实例(我假设你称之为节点)之间分配和分发分区。分区键与那一侧无关。

标签: azure partitioning azure-eventhub event-processor-host


【解决方案1】:

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

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

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

【讨论】:

  • 这不是我想要做的,而这不是发生的吗?我添加了一个基于 CustomerId 的分区键,我认为这意味着属于 CustomerId_blue 的所有数据都应该走一条路线,而属于 CustomerId_green 的所有数据都应该走另一条路线。相反,一些布鲁斯走一条路线,另一条路线,我最终在每条路线上混合了 3 个不同的 CustomerId。还是我误解了什么?这不是循环的意思/作用 - 均匀地平衡数据,而不关心它是 CustomerId_blue 还是 _green?
  • Serkant 已经提供了关于一般场景的想法,因此我将避免重复该指导。我想提的是,我相信您“使用分区键将有助于确保事件在分区之间均匀分布”的核心假设不一定是一个有效的假设。保证只是“具有相同键的事件将转到同一个分区” - 让您的四个分区键最终被路由到同一个分区是一个有效的场景,尽管不太可能。
  • 很难进一步评论您所说的“路由”和“节点”,因为它们不是事件中心的概念,我不清楚您的意思按条款。似乎您可能会说您看到使用 exact same 分区键的事件被路由到不同的分区,但情况并非如此。如果这是您所看到的,那么查看您用于发送事件的代码将会很有帮助。
【解决方案2】:

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

如果您希望客户到消费者节点的亲和性,您应该考虑为每个客户专用一个独立的 eventthub,以便您可以告诉您的系统类似

  1. node-1 仅通过使用来自 eventthub-1 的事件来处理来自 customerA 的数据

  2. node-2 仅通过使用来自 eventthub-2 的事件来处理来自 customerB 的数据 等等……

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

还有一件事。如果您计划在未来与更多的客户一起运行,那么您还需要考虑扩展您的设计,以便在客户和 EH 命名空间之间创建相似性。

【讨论】:

  • 啊,好吧 - 所以我应该为每个客户创建一个 eventthub?在考虑拥有大量客户(而不仅仅是 4 个)时,这听起来需要做很多工作。将每个客户的所有数据放在同一个地方/节点的原因是,当我需要从节点获取数据时,我不需要调用 2-3 个节点,而只需要调用 1 个,这最终会优化我的性能/执行时间.
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2015-10-08
  • 2016-02-04
  • 1970-01-01
相关资源
最近更新 更多