Kafka生产者

本文详细介绍了Kafka生产者的重要概念,包括如何创建生产者、设置必要的配置参数如`bootstrap.servers`、`key.serializer`和`value.serializer`。讨论了消息发送的三种方式:发送并忘记、同步发送和异步发送,以及相关错误处理。还涵盖了生产者的配置选项,如`acks`、`buffer.memory`和`compression.type`,以及分区策略和序列化器的作用。

创建生产者

创建生产者有三个属性是必选的
bootstrap.servers
指定broker集群的地址,格式为host:port
key.serializer
kafka broker希望收到消息的键和值都是字节数组,但是为了代码的可读性,允许producer把java对象发送给broker,但是需要指定一个实现了org.apache.kafka.common.serialization.Serializer接口的序列化器。
value.serializer
与key.serializer一样的道理。

		Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "172.16.1.1,172.16.1.2");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        producer = new KafkaProducer<>(props);

发送消息

发送消息有三种方式:

  • 发送并忘记(fire-and-forget)
  • 同步发送
  • 异步发送

发送并忘记
不关心消息是否到达

ProducerRecord<String, String> record = new ProducerRecord<>(topicName, key,value);
producer.send(record);

同步发送

ProducerRecord<String, String> record = new ProducerRecord<>(topicName, key,value);
try{
	producer.send(record).get();//producer.send(record)返回一个Future对象,调用get()阻塞等待返回结果
} catch (Exception e){
	e.printStackTrace();
}

kafkaProducer会发送两类错误

  • 可重试的:比如连接错误、无主(no leader)错误
  • 不可重试的:比如消息太大
    异步发送
    异步发送的异常需要记录下拉,producer支持回调。
ProducerRecord<String, String> record = new ProducerRecord<>(topicNameTrade, key,value);
            producer.send(record, new Callback() {
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    exception.printStackTrace();
                }
            });

生产者的配置

acks
指定要多少个分区副本收到消息,生产者才认为消息写入是成功的。其值有0、1、all.

  • 0:不等待任何服务器的相应
  • 1: 只要集群的首领节点收到
  • all: 等待所有副本都收到

buffer.memory
设置生产者内存缓冲区大小。
程序发送消息的速度 > 发送到broker的速度会导致这个缓冲区空间不足。
空间不足时程序阻塞还是抛异常取决于配置max.block.ms
compression.type
默认,消息是不会被压缩的。
producer向broker发送消息不是逐条发送的,是一批一批发送的。
发送批次有可选的压缩方式,有三种:

  • snappy
  • gzip
  • lz4

retries
重试次数
默认重试之间会等待100ms
retry.backoff.ms可设置这个等待时间
batch.size
有多个消息要发送到一个分区的时候,producer会把他们放到一个批次。
该配置指定是批次大小(字节)。
批次装满的时候会被发送出去,

序列化器

分区

kafka消息的recode包含topic、key、value。
broker用key分配分区。key相同的一定会分配到同一个分区。
如果key为null,那么将使用默认分区,默认的分区器是使用Round Robin算法。
也可以实现partitioner实现自定义分区器。

Kafka 生产者是数据进入 Kafka 集群的入口,其性能和可靠性直接影响着整个数据处理流程的效率和质量[^1]。 ### 使用方法 使用生产者发送消息时,会使用到生产者拦截器、序列化器和分区器等组件。生产者拦截器实现 `ProducerInterceptor` 接口,主要用于在消息发送前做一些准备工作,如对消息做过滤、修改消息内容,也可在发送回调逻辑前做定制化需求,例如统计类工作;序列化器实现 `Serializer` 接口,用于将数据转换为字节数组;分区器实现 `Partitioner` 接口,若未指定分区号且提供 key 时发挥作用[^2]。 ### 原理 整个生产者客户端由主线程和 Sender(发送线程)两个线程协调运行。在主线程中由 `KafkaProducer` 创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(`RecordAccumulator`,也称为消息收集器)中。Sender 线程负责从 `RecordAccumulator` 中获取消息并将其发送到 Kafka 中[^3]。 ### 配置 - `buffer.memory`:设置缓冲区,默认 32M。 - `compression.type`:默认 `none`,可以设置为 `lz4`,不过会加大 producer 发送端 CPU 开销。 - `batch.size`:默认 16K,可以到 32K,配合 `linger.ms` 加到 100 毫秒[^4]。 ### 代码示例 以下是一个简单的 Kafka 生产者代码示例: ```python from kafka import KafkaProducer import json # 创建 Kafka 生产者实例 producer = KafkaProducer( bootstrap_servers='localhost:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8') ) # 要发送的消息 message = {'key': 'value'} # 发送消息到指定主题 producer.send('test_topic', value=message) # 刷新缓冲区,确保消息发送 producer.flush() # 关闭生产者 producer.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值