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

本文介绍了Kafka消费者的工作原理,强调消费者作为消费组成员订阅主题,并详细解释了消费组如何避免消息重复,以及消费能力的伸缩性。消费者通过配置参数、订阅主题、拉取消息、提交位移来实现消费。当消费者数量超过主题分区数时,可能造成部分消费者无法消费。消费者订阅主题或分区,并可通过ConsumerRebalanceListener处理消费者动态增删时的分区再均衡策略。

生产者(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<String,String> consumer=new KafkaConsumer<String, String>(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<T> extends Closeable {
	default void configure(Map<String, ?> 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<String> topics);
void subscribe(Collection<String> topics, ConsumerRebalanceListener callback);
void subscribe(Pattern pattern, ConsumerRebalanceListener callback);
void subscribe(Pattern pattern);
//订阅分区
void assign(Collection<TopicPartition> partitions);
//取消订阅
void unsubscribe();

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值