将事件路由到 eventhub EventProcessor

Route events to eventhub EventProcessor

我有不同类型的活动。比如有的数据是遥测数据,有的是错误信息等

我认为创建多个 IEventProcessor 实现是个好主意,每个事件类型一个。所以每个实现都会以不同的方式处理事件。比如写入文件或数据库。

将事件路由到特定 EventProcessor 的最佳方式是什么?

我必须说,我发现 partitionkey 和 consumergroup(如果有的话)之间的关系记录得很糟糕。

我使用了选项 2,但到目前为止每个 EventProcessor 都从所有消费者组名获取消息,而不仅仅是 EventProcessorHost 构造函数中指定的那个。

好问题!

在回答之前 - 我想重申我们在构建 EventHub 时遵循的几个原则。

  • 我们希望事件中心成为一个高度耐用、高吞吐量的事件摄取管道。当我们已经在 Azure 上拥有现有的 pub-sub 服务如 Queues/Topics(类似于 AWS SQS,Google Pub-sub)时,提出新服务的主要区别因素是提供更高的吞吐量变体(当然,具有低延迟)。我们能够实现这个目标——但需要权衡——我们不执行任何每条消息的计算——比如在服务上执行过滤器等。当您需要每条消息的语义时 - 例如每条消息的重复数据删除,每条消息的确认接收,在您的情况下,过滤器基于每条消息属性 - 以及吞吐量要求低 - Queue/Topic 可能是您最好的选择。

  • 我们还设想,发件人(或发布者)的规模要大得多,并且根据场景的不同会有很大差异。所以我们引入了 3 种发送模式 ()。 因此,在发送时您会注意到 PartitionKey 的概念 - 它将依次转换为特定分区(将 PartitionKey 视为 EventHub 服务的线索,以计算具有相同 PartitionKey 的所有事件在同一分区上的位置)。但是,在使用事件时,没有由 EventHub 直接公开的 PartitionKey 的概念。 没有关系 b/w ConsumerGroups 和 PartitionKey

  • 而Receiver通常只是计算角色,数量有限。因此,我们公开了 1 个通用接收(消费)模式 - 从分区接收。现在,在消费事件时,可能存在基于不同因素的不同类型的消费者 - 例如:消费速度(实时与历史),或数据类型 - 因此- 我们暴露了多个消费者群体。虽然您可以创建 20 个 CG,但我们这里有一个有趣的限制是 - 购买的每个吞吐量单元可以产生 1 MBPS 的输入和 2 MBPS 的输出 - 如果在发送端充分利用,它将限制为 2 个 CG。因此,如果您正在处理完全相同的流并且有不同的方法来处理每个事件,但每个事件都需要相同的时间来处理 - 那么,使用相同的 ConsumerGroup 更有意义。

回答你的问题:这真的取决于。

这里有几个解决方案:

  • 因为,您的场景中混合了多种事件类型 - 如果您有任何需要读取和处理所有类型事件的场景,则需要 foresee/decide单个事件 consumer/processor。一个例子:我们通常看到的是 - 使用一个 ConsumerGroup,您想要计算所有错误,而其他消费者组实际上会针对每个错误类型执行特定的操作。如果,您不需要那样做——将每个 EventType 发送到不同的事件中心,然后将 1 个消费者组与特定的 IEventProcessor 一起使用——是一种选择。

  • 如果您有需要将所有事件发送到同一个 EventHub 的场景,并且如果您知道某些事件类型的处理速度非常(或需要)非常快 -您应该考虑使用不同的消费者组,每个消费者组都绑定到特定的 IEventProcessor 实现,它将忽略其他 EventTypes。 例如:如果 ErrorInfo 事件和特殊事件 需要 实时关注,并且遥测数据是否可以由于处理缓慢或高峰加载时间而受到 15 分钟的影响- 我会选择一个 ConsumerGroup 并将其命名为实时并将其与处理 2 种类型的 IEventProcessor 相关联 - 错误和特殊。创建第二个 ConsumerGroup 并将其与处理遥测事件的 IEventProcessor 绑定。