了解 Azure 事件中心分区消费者模式

Understanding Azure Event Hubs partitioned consumer pattern

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

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

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

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

我知道有 EventProcessorHost class 但我想在较低层次上了解 EventHub 的概念。

  1. Lets say for the first application, I want to store all messages in Database 1. This means, for maximum speed, In my consumer application I need to have 4 threads (consumers), each listening to one partition of the event hub, right? Each of them also has to store their own offset for the partition they're reading (checkpoint).

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

  1. Lets say my second application wants to filter the messages and only store a subset of them in Database 2. There I also need 4 consumers since I don't know which message goes to which partition, right?

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

的进程竞争
  1. Also for the two applications I need to have two consumer groups, but why? Is the filtering of the messages defined in the consumer group? I don't get it really why I need this one, since the applications consumers store the partition checkpoints by themselves and I can do the filtering within the applications itself.

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

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

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

假设您定义了一个名为 "App2-Consumer-Group" 的附加消费者组,reader 进程将接收所有消息,但不应对它们不感兴趣的消息采取任何操作。

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

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