引言
Kafka是高吞吐量的分布式消息队列。本文介绍Kafka的核心概念和应用。
一、核心概念
1 2 3 4 5 6
| Producer(生产者)→ Topic(主题)→ Partition(分区)→ Consumer(消费者)
Topic: 消息类别 Partition: 物理分区 Consumer Group: 消费者组 Offset: 消息位移
|
二、生产者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value"); producer.send(record);
producer.send(record, (metadata, exception) -> { if (exception == null) { System.out.println("Sent to partition: " + metadata.partition()); } });
|
三、消费者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "my-group"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("my-topic"));
while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } }
|
四、分区策略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
producer.send(new ProducerRecord<>("topic", "key1", "value"));
public class MyPartitioner implements Partitioner { public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { return Math.abs(key.hashCode()) % cluster.partitionCountForTopic(topic); } }
|
总结
Kafka核心:
- 高吞吐量:批量发送、压缩
- 持久化:消息存储在磁盘
- 分区:并行处理
- 消费者组:负载均衡
参考资料