Kafka 实战 - Kafka 生产者(producer)生产 topic 数据常见 API

Kafka生产者(producer)是客户端应用程序用来向Kafka集群发送消息的主要组件。以下是一些Kafka生产者API中常见的方法和操作,用于向指定Topic生产数据:

1. 创建生产者实例

首先,需要创建一个KafkaProducer实例,通常通过以下步骤:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

Producer<String, String> producer = new KafkaProducer<>(props);
  • BOOTSTRAP_SERVERS_CONFIG:设置Kafka集群的地址列表。
  • KEY_SERIALIZER_CLASS_CONFIGVALUE_SERIALIZER_CLASS_CONFIG:指定键和值的序列化器,这里使用了字符串序列化器。

2. 发送消息

创建生产者实例后,使用ProducerRecord对象封装要发送的消息,并通过send()方法将其发送至指定Topic的分区:

ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");

producer.send(record);
  • ProducerRecord包含四个参数:目标Topic名、键、值以及可选的分区(若不指定,将使用默认分区策略)。

3. 异步发送与回调

生产者支持异步发送消息,并提供回调机制以便在消息发送完成(无论成功或失败)时执行特定操作:

ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");

producer.send(record, (recordMetadata, exception) -> {
    if (exception == null) {
        System.out.println("Message sent successfully. Metadata: " + recordMetadata);
    } else {
        System.err.println("Error sending message: " + exception.getMessage());
    }
});
  • 第二个参数为一个Callback接口实现,当消息发送完成时会被调用。recordMetadata包含了消息发送成功的元数据(如分区、偏移量等),exception(若非空)表示发送过程中遇到的异常。

4. 同步发送

如果需要等待消息发送完成并立即获取结果,可以使用send()方法的同步版本sendSync()

ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key", "value");

try {
    RecordMetadata metadata = producer.send(record).get();
    System.out.println("Message sent successfully. Metadata: " + metadata);
} catch (Exception e) {
    System.err.println("Error sending message: " + e.getMessage());
}
  • get()方法会阻塞,直到消息发送完成并返回包含发送结果的Future<RecordMetadata>。若发生异常,get()会抛出。

5. 批量发送

为了提高发送效率,生产者支持批量发送消息。只需连续调用send()方法,生产者会在内部累积一定数量的消息后一次性发送:

List<ProducerRecord<String, String>> records = ... // 构建一批消息

records.forEach(producer::send);
  • 默认情况下,生产者会自动批量发送消息。可以通过调整batch.sizelinger.ms等配置项优化批量发送行为。

6. 关闭生产者

使用完毕后,记得关闭生产者以释放资源:

producer.close();
  • 可以指定一个超时时间(毫秒),在该时间内等待所有未完成的发送请求完成后再关闭。

以上就是Kafka生产者生产Topic数据的一些常见API操作。实际使用时,还需要根据业务需求配置其他生产者属性(如acks、retries、compression.type等),并妥善处理可能出现的异常和错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值