一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
前言
昨天我们一起探索了基本kafka的基本多线程数据生产和单个消费者消费数据的案例。
今天我们来探索一下kafka的分区数据推送和消费的实现
关于kafka分片的简介
我们都知道kafka有broker、topic、生产者消费者等概念,而partition(分片)就是属于topic下的。一个topic至少有一个分区,我们新的实验就是:能否使用多分区来实现2W/S的数据落盘。
我在这里简单的介绍一下kafka的topic分区。在kafka的一个topic中至少有一个或者多个topic。在不同的分区中,数据往往是不一样的。每一个消息在被分配到partition都会有一个offset(偏移量),表示当前消息的位置,偏移量从0开始,所有的消息都是追加到partition后面的。
也就是说我们推到kafka某个分区的消息从前到后对应的就是分区中的0-n位
这里主要说明一下,在一个分区中的消息是有序的,但是多个分区中的消息是无法保证先后顺序的
使用分区推送和消费数据
下面我们使用4个分区来消费2W条数据,因为我的电脑cpu比较老,只有4核4线程,所以先只能让一个线程消费5K条数据
多线程推送到不同的分区代码
这里其实和昨天多线程发送数据到一个分区的代码差不多,就是在发送的地方添加了分区配置,我在这里就只贴出来发送的代码了
producer.send("固定topic", 当前分区, "", "");
多个listener同时监听单个topic下的多个分区
这个地方是我们今天的重点,主要就是给大家介绍一下如何实现同个topic下多个分区的分区监听。
对应的注解如下
@KafkaListener(topicPartitions = {@TopicPartition(topic = "testTopic", partitions = {"0"})})
例如我们要实现监听testTopic下的四个分区的消息,且每个listener只消费自己所负责分区的数据,对应的代码如下
@KafkaListener(topicPartitions = {@TopicPartition(topic = "testTopic", partitions = {"0"})})
public void listenTestTopicA(String message) {
log.info("A" + message);
}
@KafkaListener(topicPartitions = {@TopicPartition(topic = "testTopic", partitions = {"1"})})
public void listenTestTopicB(String message) {
log.info("B" + message);
}
@KafkaListener(topicPartitions = {@TopicPartition(topic = "testTopic", partitions = {"2"})})
public void listenTestTopicC(String message) {
log.info("C" + message);
}
@KafkaListener(topicPartitions = {@TopicPartition(topic = "testTopic", partitions = {"3"})})
public void listenTestTopicD(String message) {
log.info("D" + message);
}
- @KafkaListene:kafka 监听的注解
- topicPartitions:topic 分区
- @TopicPartition:定义要监听的分区
- topic:要监听的topic
- partitions:要监听的分区
结语
大家可以试以下,在本机配置不是很高的情况下,差不多能适应分区来实现2W/S的数据消费。但是,我们现在实现了消费,没有实现业务!我们的消息分发到4个分区之后,多个分区之内我的消息是无序的。这就造成了我们获取到的数据无法实时获取最新数据。而且如果kafka的分区过多会影响kafka的性能,所以我们只能暂时放弃这个方案了
今天主要是给大家介绍一下分区的概念,现在离我们5W/S数据落盘的最终实现还差的远,明天我们介绍使用flink流式消费kafka数据,欢迎大家多多关注!