概念
消费者和消费组
kafka消费者是消费组的一部分,当多个消费者形成一个消费组来消费主题时,每个消费者会接收到不同分区的消息。假设有一个T1主题,该主题有4个分区,同时我们有一个消费组G1,该组只有一个消费者C1。那么消费者C1将会收到这4个分区的消息,如下图所示:
Kafka一个很重要的特性就是,只需写入一次消息,可以支持任意多的应用读取这个消息。换句话说,每个应用都可以读到全量的消息。为了使得每个应用都能读到全量消息,应用需要有不同的消费组。对于上面的例子,假如我们新增一个新的消费组G2,而这个消费组有两个消费者,那么会是这样的:
订阅主题和分区
创建完消费者后我们便可以订阅主题了,只需要通过调用subscribe()方法即可,这个方法接收一个主题列表:
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
consumer.subscribe(Arrays.asList(topic));
另外,我们也可以使用正则表达式来匹配多个主题,而且订阅之后如果又有匹配新主题,那么这个消费组会立即对其进行消费。正则表达式在连接Kafka与其他系统时非常有用。比如订阅所有的测试主题:
consumer.subscribe(Pattern.compile("test*"));
指定订阅的分区:
//指定订阅的分区
consumer.assign(Arrays.asList(new TopicPartition("topic0701",0)));
位移提交
对于Kafka中的分区而言,它的每条消息都有唯一的offset,用来表示消息在分区中的位置。
当我们调用poll()时,该方法会返回我们没有消费的消息。当消息从broker返回消费者时,broker并不跟踪这些消息是否被消费者接收到;Kafka让消费者自身来管理消费的位移,并向消费者提供更新位移的接口,这种更新位移方式称为提交(commit)。
网友评论