当我要创建 IoT Hub 时,Azure 平台会请求 IoT Hub 的分区数。我已经阅读了有关Azure iot hub device-to-cloud partitions of this topic purpose of the partitions ,但我不明白消费者组和分区之间的关系是什么,以及与读取数据的关系是什么。
2 回答
分区主要用于支持扩展。默认行为是发送到集线器的消息在这些分区上进行划分。
假设我们有 4 个分区 (1-4),其中包含一些消息 (AL):
分区 1:A、E、I
分区 2:B、F、J
分区 3:C、G、K
分区 4:D、H、L
还可以说我们定义了 2 个消费者组,C1 和 C2。如果您启动一个进程以从集线器读取消息,则您定义一个消费者组(如果没有,则使用默认消费者组)。
因此,让我们有 2 个阅读器,一个 (R1) 配置为使用 C1 读取,另一个 (R2) 配置为使用 C2 读取。
两个读者都可以访问相同的分区和消息。但两者都有自己的进度跟踪器。这是重要的部分!
在真实的场景中,您可能有一个数据流,让我们假设日志消息。要求是所有日志消息都必须写入数据库,并且一些具有更高日志级别的消息需要使用短信作为高优先级警报发送。如果您只有一个消费者组(C1,由 R1 读取),所有消息最终都会被处理。但是,如果数据库写入速度很慢,则很可能是在传递消息和处理消息之间需要一些时间。
现在,如果我们有 2 个消费者组,则该消费者组 (C2) 的读取器 (R2) 可以跳过所有低日志级别的消息,只处理要使用短信发送的关键消息。该阅读器将比需要将所有消息写入数据库的阅读器更快地浏览所有消息。
TL;DR:多个消费者组可用于将慢速流处理器分离为更快的流处理器。每个消费者组都在流中跟踪自己的进度。
所以最终的进展可能是这样的:
消费者组 1(做一些耗时的处理)
分区 1:A、E、I
分区 2:B、F、J
分区 3:C、G、K
分区 4:D、H、L
消费者组 2(进行一些快速消息处理)
分区 1:A、E、I
分区 2:B、F、J
分区 3:C、G、 K
分区 4:D、H、L
其中粗体字符表示已处理的消息。
编辑
如果我在同一个消费者组中有两个读者,每个读者都有自己的进度还是每个消费者组的进度?
每个阅读器通过消费者组连接到事件中心分区,进度存储在每个消费者组的每个分区中。因此,从某种意义上说,阅读器有自己的进度,但阅读器是短暂的,连接到同一分区的阅读器的新实例将在前一个阅读器离开的地方继续。