第三章 消费者
- 消费者组
- 协同器
- 创建消费者
- Offset管理
- 分区均衡监听器
消费组
为什么需要消费者组?
为了提高应用性能,可以使用多个消费者,横向扩展系统的性能。
什么是消费者组?
多个消费者的 group_id
相同并且都订阅相同的 topic
,这些消费者都属于同一个消费者组。
消费者组和主题以及分区的关系?
一个主题有多个分区,一个分区只能属于相同消费者组里一个消费者。
如果我们有一个主题,并且主题有四个分区,此时我们仅有一个消费者在消费者组里,该消费者可以从四个分区读取数据。
如果我们的消费者组里有两个消费者,那每个消费者分别拥有两个分区。
如果我们的消费者组里有四个消费者,那么每个消费者都只有一个分区
这里有一个基本的概念:消费者组里消费者不能共享分区;还有一个限制:主题的分区必须大于消费组里的消费者的数量。如果消费组里的消费者的数量比主题的分区数量多,那么就会有额外的消费者没有分区,造成资源浪费。
协同器(group coordinator)
当新的消费者加入消费组或离开消费组,kafka怎么处理它们?分区会被赋给其他消费者?由谁来管理这些?
协同器
这些情况都是由协同器(group coordinator)来管理。kafka的一个broker会被选举出来作为协同器。当一个新的消费者要加入时,它会发送请求到协同器。第一个加入消费组的消费者会变成消费组leader。其他消费者属于消费者成员。协同器的职责是管理消费组,每次有消费者加入或离开,协同器就会修改消费者列表,并且触发分区平衡。
分区平衡:新的消费者你需要为它分配分区,或者当消费者离开时,该消费者的分区分配给其他的消费者。
消费组leader
消费组leader的职责是执行分区平衡。消费组leader会获取当前成员列表,分配分区给它们,然后把发送这些信息给协同器。协同器会和消费成员交流关于分区的信息。在分区平衡过程中,消费者不能读取消息。
创建消费组
创建消费者和创建生产者类似,只是有几个参数不一样。
group_id
:用来表明消费者属于哪个组
订阅主题
消费者可以订阅一个或多个主题。如果我们想订阅多个主题时,可以使用正则表达式或通配符。
拉取消息
kafka给我们提供了非常直观的方法 poll()
来获取消息。poll()
方法它会帮助我们处理协同的工作、分区平衡、发送心跳等工作。当我们第一次调用 poll()
拉取消息时,消费者会去找协同器,并加入组,获取分区,最后拉取消息。每次调用 poll()
方法时,消费者将发送心跳到协同器,表明自己还没有down。如果消费者down,会触发分区平衡。
public class NewSupplierConsumer {
public static void main(String[] args) throws Exception {
String topicName = "SupplierTopic";
String groupName = "SupplierTopicGroup";
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", groupName);
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "SupplierDeserializer");
InputStream input = null;
KafkaConsumer<String, Supplier> consumer = null;
try {
input = new FileInputStream("SupplierConsumer.properties");
props.