Java使用Kafka记录
1. Kafka的基本概念
Kafka是一个分布式的MQ。具备较高的吞吐量。
1.1 broker
Kafka集群包含一个或多个服务器,服务器节点成为broker。broker存储topic的数据。
1.2 Topic
写入Kafka集群的消息都有一个类别,这个类别被称为Topic。
1.3 Partition
Topic中的数据分割为一个或多个partition。每个partition中的数据使用多个切片文件存储。partition中的数据是有序的,不同partition间的数据顺序则不一致。
其中,一个Partition中,只有一个Topic;一个Topic,可以被分隔为不同的Partition。
1.4 Producer
生产者,主要是用来生产数据的,将消息发布到指定的topic。broker接收到消息之后,会将该消息追加到数据分片中。生产者可以指定存储的partition。
1.5 Consumer
消费者可以从broker读取数据,消费者可以消费多个topic中的数据。
1.6 Consumer Group
每个consumer属于一个特定的Grouper
1.7 Leader
每个partition有多个副本,其中只有一个作为Leader,是当前负责数据读写的partition
1.8 Follower
Follower跟随Leader,所有写请求都通过Leader路由。数据变更会广播给所有对的Follower,Follower与Leader保持数据同步。如果Leader失败,则从Follower中选举出一个新的Leader。
2. java 使用kafka
- 添加依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.5.1</version>
</dependency>
- 创建生产者
@Bean(value = "kafkaProducer")
public KafkaProducer<String, String> getKafkaProducer() throws IOException {
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource resource = pathMatchingResourcePatternResolver.getResource("classpath:config/kafka/kafka_producer.properties");
InputStream inStream = resource.getInputStream();
Properties properties = new Properties();
properties.load(inStream);
return new KafkaProducer<String, String>(properties);
}
- 写入数据
try {
// 写入kafka
ProducerRecord<String, String> producerRecord = new ProducerRecord<>(topicName, JSON.toJSONString(po));
kafkaProducer.send(producerRecord);
}catch (Exception e){
logger.error("write kafka error!",e);
}