Azure 事件中心使用分区使用者模式中描述的docs https://learn.microsoft.com/en-us/azure/event-hubs/event-hubs-features。
当涉及到现实世界场景时,我在理解该模型的消费者方面存在一些问题。
假设我有 1000 条消息发送到带有 4 个分区的事件中心,但未定义任何分区 ID。这意味着消息将使用循环方法发送到所有分区。
现在我想让两个应用程序将消息分发到两个不同的数据库。我的问题有:
- 假设对于第一个应用程序,我想将所有消息存储在数据库 1 中。这意味着,为了获得最大速度,在我的消费者应用程序中,我需要有 4 个线程(消费者),每个线程监听事件中心的一个分区,对吗?他们每个人还必须存储自己正在读取的分区的偏移量(检查点)。
- 假设我的第二个应用程序想要过滤消息并只将其中的一部分存储在数据库 2 中。我还需要 4 个使用者,因为我不知道哪条消息发送到哪个分区,对吧?
- 另外,对于这两个应用程序,我需要有两个消费者组,但为什么呢?消息的过滤是在消费者组中定义的吗?我不明白为什么我需要这个,因为应用程序使用者自己存储分区检查点,并且我可以在应用程序本身内进行过滤。
我知道有事件处理器主机 https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.eventhubs.processor.eventprocessorhost?view=azure-dotnet类,但我想在较低级别上了解 EventHub 的概念。
- 假设对于第一个应用程序,我想将所有消息存储在数据库 1 中。这意味着,为了获得最大速度,在我的消费者应用程序中,我需要有 4 个线程(消费者),每个线程监听事件中心的一个分区,对吗?他们每个人还必须存储自己正在读取的分区的偏移量(检查点)。
正确的,每个配置的分区都应该有一个进程。因此,如果您有 4 个处理器,则应该有 4 个进程,每个进程处理特定分区的消息。如果您使用EventProcessorHost
它会为您处理流程的启动。
- 假设我的第二个应用程序想要过滤消息并仅将其中的子集存储在数据库 2 中。我还需要4位消费者因为我不知道哪条消息发送到哪个分区,对吧?
您对消费者意味着什么?您还需要 4 个进程来处理消息but它们应该配置为使用不同的消费者组进行读取。否则它们将与 1 的进程竞争
- 另外,对于这两个应用程序,我需要有两个消费者组,但为什么呢?消息的过滤是在消费者组中定义的吗?我不明白为什么我需要这个,因为应用程序使用者自己存储分区检查点,并且我可以在应用程序本身内进行过滤。
让我们定义一个消费者组:
消费者组使多个消费应用程序能够各自拥有传入消息流的单独视图,并以自己的速度和自己的偏移量独立读取流
所以是的,你需要两个不同的消费者群体。
每个消费者组将获取发送到事件中心分区的所有消息。每个消费者组在消息流中跟踪自己的进度。这就是为什么您的场景需要两个。
假设您定义了一个名为“App2-Consumer-Group”的附加消费者组,读取器进程将接收所有消息,但不应对他们不感兴趣的消息采取任何操作。
如果您不创建额外的使用者组,则默认使用者组的读取器进程将处理第一个应用程序的消息,并使用检查点机制将它们标记为已处理。第二个应用程序的读取器进程不会收到任何消息,因为它们已被标记为已处理。 (在现实生活中,当使用一个消费者组时,某些消息可能会被第一个应用程序的读取器进程拾取,而某些消息可能会被第二个应用程序的读取器进程拾取,因为这些进程将尝试获取某个消息的锁定。特定分区)
我认为这张图清楚地显示了消费者群体如何跟踪自己在消息流中的进度,因此如果您对两个不同的应用程序有两种不同的处理逻辑,那么为什么您需要两个它们:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)