【问题标题】:Understanding Azure Event Hubs partitioned consumer pattern了解 Azure 事件中心分区使用者模式
【发布时间】:2019-11-28 10:18:22
【问题描述】:

Azure 事件中心使用docs 中描述的分区使用者模式。 当涉及到现实世界的场景时,我在理解这个模型的消费者方面时遇到了一些问题。

假设我有 1000 条消息发送到具有 4 个分区的事件中心,没有定义任何分区 ID。这意味着消息将使用循环方法发送到所有分区。

现在我想让两个应用程序将消息分发到两个不同的数据库。我的问题是:

  1. 假设对于第一个应用程序,我想将所有消息存储在数据库 1 中。这意味着,为了获得最大速度,在我的消费者应用程序中,我需要有 4 个线程(消费者),每个线程都侦听事件中心的一个分区, 对?他们每个人还必须为正在读取的分区(检查点)存储自己的偏移量。
  2. 假设我的第二个应用程序想要过滤消息并仅将其中的一部分存储在数据库 2 中。我还需要 4 个消费者,因为我不知道哪个消息进入哪个分区,对吧?
  3. 对于这两个应用程序,我还需要有两个消费者组,但为什么呢?消息的过滤是否定义在消费者组中?我不明白为什么我需要这个,因为应用程序消费者自己存储分区检查点,我可以在应用程序本身内进行过滤。

我知道有 EventProcessorHost 类,但我想在较低级别上了解 EventHub 的概念。

【问题讨论】:

    标签: azure bigdata cloud iot azure-eventhub


    【解决方案1】:
    1. 假设对于第一个应用程序,我想将所有消息存储在数据库 1 中。这意味着,为了获得最大速度,在我的消费者应用程序中,我需要有 4 个线程(消费者),每个线程都侦听事件中心的一个分区, 对?他们每个人还必须为正在读取的分区(检查点)存储自己的偏移量。

    正确,您应该为每个预置分区设置一个进程。所以,如果你有 4 个处理器,你应该有 4 个进程,每个进程处理特定分区的消息。如果您使用 EventProcessorHost 处理消息,它将为您处理进程的启动。

    1. 假设我的第二个应用程序想要过滤消息并仅将其中的一部分存储在数据库 2 中。我还需要 4 个消费者,因为我不知道哪个消息进入哪个分区,对吗?

    你对消费者是什么意思?您需要另外 4 个进程来处理消息它们应该配置为使用不同的消费者组读取。否则它们将与 1 的进程竞争

    1. 对于这两个应用程序,我还需要有两个消费者组,但为什么呢?消息的过滤是否定义在消费者组中?我不明白为什么我需要这个,因为应用程序消费者自己存储分区检查点,我可以在应用程序本身内进行过滤。

    让我们定义一个消费者组:

    消费者组允许多个消费应用程序分别拥有传入消息流的单独视图,并以自己的速度和自己的偏移量独立读取流

    所以是的,您需要 2 个不同的消费者群体。 每个消费者组将获取发送到事件中心分区的所有消息。每个消费者组在消息流中跟踪自己的进度。这就是为什么您的场景需要两个。

    假设您定义了一个名为“App2-Consumer-Group”的附加消费者组,阅读器进程将接收所有消息,但不应对他们不感兴趣的消息采取任何行动。

    如果您不创建额外的消费者组,默认消费者组的读取器进程将处理第一个应用程序的消息,并使用检查点机制将它们标记为已处理。第二个应用程序的读取器进程将不会收到任何消息,因为它们已被标记为已处理。 (在现实生活中,当使用带有某些消息的消费者组时,第一个应用程序的读取器进程可能会拾取一些消息,而第二个应用程序的读取器进程可能会拾取一些消息,因为这些进程将尝试锁定一个具体分区)

    我认为这张图片清楚地显示了消费者群体如何在消息流中跟踪他们自己的进度,因此如果您对 2 个不同的应用程序有 2 个不同的处理逻辑,为什么需要两个他们:

    【讨论】:

    • 谢谢,现在更清楚了。我的误解是进程只需要自己存储偏移量而不是“标记”消息。顺便提一句。我可以以某种方式配置消费者组以不获取所有消息并进行一些预过滤吗?
    • @TobiasvonFalkenhayn,是的,这是可能的。你可以按照这个answer做一些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2022-01-04
    • 2016-11-16
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多