kafka读书笔记-消费者-消息组与消息订阅

生产者(Producer)是负责向kafka服务集群发送消息的,消费者(Consumer)则是从kafka集群拉取消息进行消费的。

kafka中的消费者不是直接订阅kafka服务进行消费的,而是作为消费组(Consumer group)的一员消费消息的。消费者以消费组为单位订阅kafka指定主题(Topic)或者主题的特定分区(Partion),同一个消费组的消费者不会重复消息,假若一个组有A,B两个消费者,那么kafka服务节点中对应Topic的消息已经被A消费后,那么整个组的消费位移Offset就会前移,B就不会再次消费A消费过的消息。当然也可以通过手动指定消费位移达到重复消费的效果,但是如果想要所有消息均能广播给多个消费者消费,完全可以采用多个消费组的消费者去订阅同一Topic的方式。

消费组和消费者的概念可以使消费能力具备伸缩性,即可以增减消费者来达到提高或降低消费能力的结果。但是默认的分区分配策略下,一个分区只能被一个消费者消费,即如果消费者增加到了超过Topic的分区数的情况时,会出现多余的消费者无法分配分区而消费不到消息的结果。当然分区分配策略也可以进行修改,修改时会涉及到多个消费者同步同一个分区的消费位移Offset的情况,需要注意并发安全问题,增加了代码复杂度。

消费者的客户端调用代码如下:

//初始化客户端配置信息
Properties properties=initConfig();
KafkaConsumer consumer=new KafkaConsumer(properties);
//订阅指定主题list
consumer.subscribe(topics);

消费逻辑为:
1.配置消费者客户端参数及创建响应的消费者实例
2.订阅主题
3.拉取消费并消费
4.提交消费位移
5.关闭消费者实例

客户端必要的参数配置有:
bootstrap.servers:指定kafka集群必需的broker地址清单。
group.id:指定消费组名称
key.deserializer和value.deserializer:与生产者客户端中的key.serializer和value.serializer对应的反序列化操作。

public interface Deserializer extends Closeable {
	default void configure(Map configs, boolean isKey) {}
	T deserialize(String topic, byte[] data);
	default T deserialize(String topic, Headers headers, byte[] data) {
        return deserialize(topic, data);
    }
    default void close() {}
}

key.deserializer和value.deserializer可定制,定制化的反序列化类需继承Deserializer接口,configure配置反序列化的编码类型,deserialize为具体的反序列化方法,close为关闭反序列化器时的操作。

消费者可以订阅主题或分区,对应的订阅和取消订阅方法如下:

//订阅主题
void subscribe(Collection topics);
void subscribe(Collection topics, ConsumerRebalanceListener callback);
void subscribe(Pattern pattern, ConsumerRebalanceListener callback);
void subscribe(Pattern pattern);
//订阅分区
void assign(Collection partitions);
//取消订阅
void unsubscribe();

订阅主题或分区的方法都需传入对应的主题或分区列表,值得注意的是订阅主题的方法subscribe中还包含了ConsumerRebalanceListener参数,这个参数的意义是增删消费者时进行的再均衡策略,增删消费者时kafka会先把现有的消费者停止消费,然后调用ConsumerRebalanceListener的onPartionsRevoked方法,之后开始再均衡。再均衡重新分配分区之后,会调用ConsumerRebalanceListener的onPartitionsAssigned方法,之后消费者再开始进行消费。之后讲述消费者具体消费消息及消费位移的提交绑定情况时会进一步介绍该参数的方法。

你可能感兴趣的:(读书,笔记)