无线领域重要的事情可能不是5G
|
Range 算法并不会把多个主题分区当成一个整体。 从上面的例子我们可以总结出Range算法的一个弊端:那就是同一个消费者组内的消费者消费的消息数量相差可能较大。 4.3 offset 的维护 由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。
Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,consumer 默认将 offset保存在 Kafka 一个内置的 topic 中,该 topic 为 _consumer_offsets。 这种情况下,采用 RoundRobin 算法分配,多个主题会被当做一个整体来看,这个整体包含了各自的 Partition,比如在 Kafka-clients 依赖中,与之对应的对象为 TopicPartition。接着将这些 TopicPartition 根据其哈希值进行排序,排序后采用轮询的方式分配给消费者。 但这会带来一个问题:假如上图中的消费者组中,ConsumerA 只订阅了 TopicA 主题,ConsumerB 只订阅了TopicB 主题,采用 RoundRobin 轮询算法后,可能会出现 ConsumerA 消费了 TopicB 主题分区里的消息,ConsumerB 消费了 TopicA 主题分区里的消息。 综上所述,RoundRobin 算法只适用于消费者组中消费者订阅的主题相同的情况。同时会发现,采用 RoundRobin 算法,消费者组里的消费者之间消费的消息个数最多相差 1 个。 Range Kafka 默认采用 Range 分配策略,Range 顾名思义就是按范围划分的意思。
比如现在有一个三个消费者 ConsumerA、ConsumerB 和 ConsumerC 组成的消费者组,同时消费 TopicA 主题消息,TopicA分为7个分区,如果采用 Range 分配策略,过程如下所示: 消费者是以 consumer group 消费者组的方式工作,由一个或者多个消费者组成一个组, 共同消费一个 topic。每个分区在同一时间只能由 group 中的一个消费者读取,但是多个 group 可以同时消费这个 partition。在图中,有一个由三个消费者组成的 group,有一个消费者读取主题中的两个分区,另外两个分别读取一个分区。某个消费者读取某个分区,也可以叫做某个消费者是某个分区的拥有者。 在这种情况下,消费者可以通过水平扩展的方式同时读取大量的消息。另外,如果一个消费者失败了,那么其他的 group 成员会自动负载均衡读取之前失败的消费者读取的分区。 消费者组最为重要的一个功能是实现广播与单播的功能。一个消费者组可以确保其所订阅的 Topic 的每个分区只能被从属于该消费者组中的唯一一个消费者所消费;如果不同的消费者组订阅了同一个 Topic,那么这些消费者组之间是彼此独立的,不会受到相互的干扰。 如果我们希望一条消息可以被多个消费者所消费,那么可以将这些消费者放到不同的消费者组中,这实际上就是广播的效果;如果希望一条消息只能被一个消费者所消费,那么可以将这些消费者放到同一个消费者组中,这实际上就是单播的效果。 4.2 分区分配策略 一个 consumer group 中有多个 consumer,一个 topic 有多个 partition,所以必然会涉及到 partition 的分配问题,即确定哪个 partition 由哪个 consumer 来消费。 Kafka 有两种分配策略,一是 RoundRobin,一是 Range。 RoundRobin
RoundRobin 即轮询的意思,比如现在有一个三个消费者 ConsumerA、ConsumerB 和 ConsumerC 组成的消费者组,同时消费 TopicA 主题消息,TopicA 分为 7 个分区,如果采用 RoundRobin 分配策略,过程如下所示: (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

