目录
下载和安装
下载地址
https://kafka.apache.org/downloads
解压步骤
tar -zxvf kafka_2.12-2.1.0.tgz
修改 kafka-server 配置
kafka_2.12-2.1.0/config/server.properties
```
broker.id=1
log.dir=/kafka/logs
```
使用
功能 | 启动命令 | 备注 |
---|---|---|
启动Zookeeper | bin/zookeeper-server-start.sh -daemon config/zookeeper.properties | Kafka安装包自带ZK, 可以单节点启动 |
启动 Kafka 服务器 | 启动 Kafka 服务器 | |
创建 Topic(test) | bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test | –replication-factor 1: 副本数 --partitions 1: 分区数 |
Topic 列表 | bin/kafka-topics.sh --list --zookeeper localhost:2181 | |
启动 Producer | bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test | |
启动 Consumer | bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning | |
Topic 相关信息(test) | bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning |
使用Kafka原生API发送消息
Kafka Producer发送消息的方式
1. 只管发送, 不管结果
只调用接口发送消息到 Kafka 服务器, 但不管成功写入与否。 由于 Kafka 是高可用的, 因此大部分情况下消息都会写入, 但在异常情况下会丢消息。
private static KafkaProducer<String, String> producer;
static {
Properties properties = new Properties();
properties.put("bootstrap.servers", "127.0.0.1:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(properties);
}
// 向Kafka推送消息,不关心结果
private static void sendMessageForgetResult() {
ProducerRecord<String, String> record = new ProducerRecord<>("kafka-study", "name", "ForgetResult");
producer.send(record);
producer.close();
}
2. 同步发送消息
调用 send() 方法返回一个 Future 对象, 我们可以使用它的 get() 方法来判断消息发送成功与否。
private static KafkaProducer<String, String> producer;
static {
Properties properties = new Properties();
properties.put("bootstrap.servers", "127.0.0.1:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(properties);
}
// 向Kafka同步发送数据
private static void sendMessageSync() throws Exception {
ProducerRecord<String, String> record = new ProducerRecord<>("kafka-study", "name", "sync");
// 调用get()方法, 会等待kafka集群的响应. 当发送失败时会抛出异常.
// 1. 不可恢复的异常(如:发送的消息过大), 2. 可恢复的异常broker会进行重试,一定次数之后才会抛出异常(如:连接超时)
RecordMetadata result = producer.send(record).get();
System.out.println(result.topic());
System.out.println(result.partition());
System.out.println(result.offset());
}
3. 异步发送
调用 send() 时提供一个回调方法, 当接收到 broker 结果后回调此方法。
private static KafkaProducer<String, String> producer;
static {
Properties properties = new Properties();
properties.put("bootstrap.servers", "127.0.0.1:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(properties);
}
// 自定义回调类, 需要实现org.apache.kafka.clients.producer.Callback接口
private static class MyProducerCallback implements Callback {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (null != e) {
e.printStackTrace();
return;
}
System.out.println(recordMetadata.topic());
System.out.println(recordMetadata