kafka生产者-实例参数配置

必填参数

// 创建kafka生产者的配置信息
Properties props = new Properties();

bootstrap.servers

bootstrap.servers:指定生产者客户端连接kafka集群所需的broker地址列表,格式为host1:port1,host2:port2,可以设置一个或多个。这里并非需要所有的broker地址,因为生产者会从给定的broker里寻找其它的broker。

// kafka 集群,broker-list
props.put("bootstrap.servers", "192.168.100.132:9092,192.168.100.133:9092,192.168.100.134:9092");

key.serializer和value.serializer

key.serializer和value.serializer:broker接收消息必须以字节数组byte[]形式存在,KafkaProducer<K,V>和ProducerRecord<K,V>中的泛型就是key和value的类型。key.serializer和value.serializer分别用来指定key和value序列化操作的序列化器,无默认值。类的全限定名。

//序列化
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

非必填参数

client.id

client.id:这个参数用来设定kafkaProducer对应的客户端id,默认值为“”,如果不设置,会自动生成一个非空字符串,内容形式如:“producer-1”,“producer-2”…

acks

acks:这个参数用于指定分区中必须由多少个副本收到消息,之后生产者才会认为这条消息写入是成功的。acks参数有三种类型的值(都是字符串类型)。
acks=1 默认值为1.生产者发送消息之后,只要分区的leader副本成功的写入消息,生产端就会收到来自服务端的成功响应,说明发送成功。如果消息无法写入leader副本,比如在leader副本崩溃、重新选举新的leader副本的过程中,生产者就会收到一个错误的响应,为了避免消息丢失,生产者就会选择重发消息;如果消息写入leader副本并成功响应给生产者,并且在其他follower副本拉取之前leader副本崩溃,此时消息还会丢失,因为新选举的leader副本中并没有这条对应的消息。acks设置为1,是消息可靠性和吞吐量之间的这种方案。
acks=0 生产者发送消息之后,不需要等待任何服务端的响应。如果在消息从发送到写入kafka的过程中出现异常,导致kafka并没有收到消息,此时生产者是不知道的,消息也就丢失了。akcs设置为0时,kafka可以达到最大的吞吐量。
acks=-1acks=all 生产者在消息发送之后,需要等待isr中所有的副本都成功写入消息此案能够收到服务端的成功响应。acks设置为-1,可以达到相对最强的可靠性。但这不一定是最可靠的,因为isr中可能就只有leader副本,这样就退化成了acks=1 的情况。
注意,acks参数是一个字符串类型,而不是一个整数类型。配置错误会报异常。

// ack应答级别
props.put("acks", "all");

max.request.size

max.request.size:生产者客户端能发送消息的最大值,默认值为1048576B,1MB。
不建议盲目修改,这个参数涉及其他的一些参数的联动,
比如broker端的message.max.bytes参数,如果broker的message.max.bytes参数设置为10,而max.request.size设置为20,当发送一条大小为15B的消息时,生产者参数就会报错。

retries和retry.backoff.ms

retries和retry.backoff.ms:生产者重试次数,默认值为0。消息在从生产者从发出到成功写入broker之前可能发生一些临时性异常,比如网络抖动、leader副本选举等,这些异常往往是可以自行恢复的,生产者可以配置retries的值,通过生产端的内部重试来恢复而不是一味的将异常抛给生产者;如果重试达到设定次数,生产者才会放弃重试并抛出异常。但是!并不是所有的异常都可以通过重试来解决,比如消息过大,超过max.request.size参数配置的数值。重试还和参数retry.backoff.ms有关,默认值为100,用来设定两次重试之间的时间间隔,避免无效的频繁重试。在配置retries和retry.backoff.ms之前,最好先估算一下可能的异常恢复时间,这样可以设定总的重试时间要大于异常恢复时间,避免生产者过早的放弃重试。

// 重试次数
props.put("retries", 1);

connections.max.idele.ms

connections.max.idele.ms:这个参数用来制动多久之后关闭限制的连接,默认值540000(ms),9分钟。

linger.ms

linger.ms:这个参数用来指定生产者发送ProducerBatch之前等待更多的消息(ProducerRecord)假如ProducerBatch的时间,默认值为0。ProducerBatch在被填满或者时间超过linger.ms值时发送出去。增大这个参数的值回增加消息的延迟(消费端接收延迟),但能够提升一定的吞吐量。

// 等待时间
props.put("linger.ms", 1);

receive.buffer.bytes

receive.buffer.bytes:这个参数用来设置socket接收消息缓冲区的大小,默认值为32768(B),即32KB。如果设置为-1,则使用操作系统的默认值。如果Producer和Kafka处于不同的机房,则可以适当的调大这个参数值。

send.buffer.bytes

send.buffer.bytes:这个参数用来设置socket发送消息缓冲区的大小,默认值为131072(B),即128KB。与receive.buffer.bytes参数一样,如果设置为-1,则使用操作系统的默认值。

request.timeout.ms

request.timeout.ms:这个参数用来配置Producer等待请求响应的最长时间,默认值为3000(ms)。请求超时之后可以选择进行重试。这个参数需要比broker端参数replica.lag.time.max.ms值要大,这样可以介绍因客户端重试引起的消息重复的概率。

enable.idempotence

enable.idempotence:幂等性开启,默认为false。

bootstrap.servers

bootstrap.servers:broker集群地址,可以设置一到多个,建议至少设置为2个,若在应用程序启动的时候,一个broker节点宕机,还可以对另一个已提供节点进行连接。

partitioner.class

partitioner.class:显示配置使用哪个分区器。

interceptor.classes

interceptor.classes:指定自定义拦截器,多个传List集合。

buffer.memory

buffer.memory:生产者客户端RecordAccumulator缓存大小,默认值为33554432B,即32M。

// RecordAccumulator 缓冲区大小
props.put("buffer.memory", 33554432);

batch.size

batch.size:ProducerBatch可以复用内存区域的大小

max.block.ms

max.block.ms:最大阻塞时间,RecordAccumulator缓存不足时或者没有可用的元数据时,KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,此参数的默认值为60000,即60s。

metadata.max.age.ms

metadata.max.age.ms:当客户端超过这个时间间隔时就会更新元数据信息默认值300000,即5分钟。元数据指集群中有哪些主题,主题有哪些分区,每个分区leader副本在哪个节点上,follower副本在哪个节点上,哪些副本在AR,ISR等集合中,集群中有哪些节点等等。

compression.type

compression.type:指定消息的压缩方式,默认值为"none",可以配置为"gzip",“snappy”和“lz4”。

connections.max.idle.ms

connections.max.idle.ms:用来指定多久之后关闭闲置的连接,默认值540000(ms),即9min

max.in.flight.requests.per.connection

max.in.flight.requests.per.connection:限制每个连接,也就是客户端与Node之间的连接最多缓存请求数,默认值5

transactional.id

transactional.id:设置事务id,必须唯一,默认值null

附带java代码

public static void main(String[] args) throws ExecutionException, InterruptedException {
		// 创建kafka生产者的配置信息
		Properties props = new Properties();
		// kafka 集群,broker-list
		props.put("bootstrap.servers", "192.168.100.132:9092,192.168.100.133:9092,192.168.100.134:9092");
		// ack应答级别
		props.put("acks", "all");
		// 重试次数
		props.put("retries", 1);
		// 批次大小 默认
		props.put("batch.size", 16384);
		// 等待时间
		props.put("linger.ms", 1);
		// RecordAccumulator 缓冲区大小
		props.put("buffer.memory", 33554432);
		props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
		props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
		// 创建生产者对象
		Producer<String, String> producer = new KafkaProducer<>(props);
		//发送消息
		for (int i = 0; i < 1000; i++) {
				// 每条数据都要封装成一个 ProducerRecord 对象,定义主题
		producer.send(new ProducerRecord<>("test",Integer.toString(i),Integer.toString(i)));
		}
		// 关闭资源
		producer.close();
}

参考文章:https://blog.csdn.net/u012326462/article/details/104862942

https://www.cnblogs.com/luckyhui28/p/12001798.html

猜你喜欢

转载自blog.csdn.net/m0_43393325/article/details/107507500
今日推荐