Kafka
消费者
基于
Offset
消费
过程
Kafka消费者基于Offset消费过程,Kafka消费者组的设计消费者根据Offset消费过程消费者消费中遇到的问题手动提交Commit Offset,目录,Content,一个消费者消费Topic,Topic有3个分区,消费者只能按照顺序串行消费,性能较差,Kafka消费者组的设计,如何不设计消费者组,生产者Producer,Kafka集群,TopicA,200万条part0,200万条part1,200万条part2,消费者Consumer,生产者生产600万条数据,Part0-200万条,Part1-200万条,Part2-200万条,消费者组Consumer Group,一个消费者组消费一个Topic,Topic有3个分区,消费者组中有3个消费者,三个消费者并行消费分区,性能较高,Kafka消费者组的设计,构建消费者组,多个消费者并行消费,生产者Producer,Kafka集群,TopicA,200万条part0,200万条part1,200万条part2,消费者1Consumer1,生产者生产600万条数据,消费者2Consumer2,消费者3Consumer3,Kafka消费者组的设计消费者根据Offset消费过程消费者消费中遇到的问题手动提交Commit Offset,目录,Content,生产者不断将数据生产写入Topic的分区中,每个分区写入数据并添加offset,消费者根据Offset消费过程,生产者第一次生产数据,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,消费者消费对应分区的数据,并记录自己当前消费的offset,用于下一次消费请求,消费者根据Offset消费过程,消费者根据Offset消费数据,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,第一次消费从offset为0开始消费,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,记录当前消费Offset为:1,记录当前消费Offset为:1,记录当前消费Offset为:0,消费者根据上一次记录的消费Offset+1,向Kafka继续请求消费每个分区下个批次的数据,消费者根据Offset消费过程,消费者根据Offset消费数据,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,消费者组Consumer Group,Consumer1,Consumer2,Consumer3,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,下一次消费从上次消费的offset+1开始消费,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,记录当前消费Offset为:3,记录当前消费Offset为:2,记录当前消费Offset为:1,Offset:2-K6 V6Offset:3-K7 V7,Offset:2-K8 V8,Offset:1-K9 V9,Offset:2-K6 V6Offset:3-K7 V7,Offset:2-K8 V8,Offset:1-K9 V9,Kafka消费者组的设计消费者根据Offset消费过程消费者消费中遇到的问题手动提交Commit Offset,目录,Content,消费者将每次消费成功的Offset自动维护在自己的内存中,如果消费者故障,内存中的offset就会丢失,消费者消费中遇到的问题,问题1:如果消费者故障,重启消费者,消费者如何知道自己上一次的消费位置?,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,消费者组Consumer Group,Consumer1,Consumer2,Consumer3,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,下一次消费从上次消费的offset+1开始消费,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,记录当前消费Offset为:1,记录当前消费Offset为:1,记录当前消费Offset为:0,Offset:2-K6 V6Offset:3-K7 V7,Offset:2-K8 V8,Offset:1-K9 V9,消费者将每次消费成功的Offset自动维护在自己的内存中,如果消费者故障,内存中的offset就会丢失,消费者消费中遇到的问题,问题1:如果消费者故障,重启消费者,消费者如何知道自己上一次的消费位置?,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,消费者组Consumer Group,Consumer1,Consumer2,Consumer3,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,下一次消费从上次消费的offset+1开始消费,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,上次的Offset从内存中丢失,上次的Offset从内存中丢失,上次的Offset从内存中丢失,Offset:2-K6 V6Offset:3-K7 V7,Offset:2-K8 V8,Offset:1-K9 V9,Kafka会将每个消费者的offset持久化在一个自带的Topic中,消费者消费中遇到的问题,问题1的解决:Kafka会定期自动将每个消费者消费的分区的Offset记录在_consumer_offsets中,生产者Producer,Kafka集群,TopicA,part0,part1,part2,生产者源源不断的生产KV数据,消费者组Consumer Group,Consumer1,Consumer2,Consumer3,K1 V1K2 V2K3 V3K4 V4K5 V5,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,下一次消费从上次消费的offset+1开始消费,Offset:0-K1 V1Offset:1-K4 V4,Offset:0-K2 V2Offset:1-K5 V5,Offset:0-K3 V3,记录当前消费Offset为:1,记录当前消费Offset为:1,记录当前消费Offset为:0,Offset:2-K6 V6Offset:3-K7 V7,Offset:2-K8 V8,Offset:1-K9 V9,Topic_consumer_offsets,Kafka会将每个消费者的offset持久化在一个自带的Topic中,消费者消费中遇到的问题,问题1的解决:Kafka会定期自动将每个消费者消费的分区的Offset记录在_consumer_offsets中,生产者Producer,Kafka集群,TopicA,part0,