在Kafka中,消息以主题(Topic)的形式组织,消费者通过订阅这些主题来读取消息。以下是关于Kafka消费者读取数据方式的详细解析,包括订阅模式(Subscribe)、正则订阅模式(Subscribe Pattern with Regular Expressions)以及指定模式(Assign),并探讨了偏移量管理的差异。
1. 订阅模式(Subscribe)
-
单主题订阅:在大多数情况下,如果只需要订阅单个主题,可以直接使用订阅模式。在这种模式下,Kafka服务器负责管理每个消费者的偏移量,即每个消费者组(由
groupID
标识)在每个分区中已读取到的位置。 -
工作原理:Kafka内部使用
_consumer_offsets
主题来存储消费者的偏移量信息。当消费者读取消息时,其当前分区的偏移量会被记录到_consumer_offsets
中。下次启动时,如果groupID
和topic
相同,消费者会从_consumer_offsets
中读取上次的偏移量,继续从该位置开始读取数据。
2. 正则订阅模式(Subscribe Pattern with Regular Expressions)
- 多主题订阅:如果需要订阅一系列具有某种命名规律的主题,可以使用正则表达式来订阅这些主题。这使得管理大量相关主题变得更加高效和灵活。
3. 指定模式(Assign)
-
手动管理分区和偏移量:在指定模式下,消费者需要明确指定要订阅的分区以及每个分区的起始偏移量。这种模式将偏移量的管理责任交给了客户端。
-
工作原理:消费者可以使用外部存储(如Redis)来跟踪和更新每个分区的偏移量。首次读取时,将偏移量存储到Redis中。在后续的读取过程中,消费者首先从Redis中获取最新的偏移量,然后根据这些偏移量并行地读取各个分区的消息。
接下来再用图示的方式,通过一个流程再讲述一下订阅和指定的区别,偏移量服务器管理和客户端管理的区别以及模式:
在客户端(消费者),有一个groupID和一个topic。订阅模式中,kafka中会有一个_consumer_offsets主题专门存储偏移量。在读取的时候,就会在kafka的_consumer_offsets中就会把各分区的偏移量记录下来,这样在下一次读取的时候,如果有相同的groupId,相同的topic,就会直接在_consumer_offsets中读取到这个偏移量,然后从topic的对应偏移量往后继续读取。在指定模式中,可以先有一个与程序实时同步的Redis数据库,第一次读取的时候,把读取的偏移量,用键值对的方式存储到Redis服务器,键可以就是topic。这样偏移量就存储在了Redis,在下一次读取的时候,先把Redis中的偏移量读取到客户端的内存中,这样客户端可以并行的读取分区和偏移量,并直接通过信息并行访问kafka相应主题继续读取数据。