前言
上一篇文章【大数据实践】Kafka生产者编程(4)——ProducerConfig详解(上)中,对kafka producer的相关配置项进行了部分介绍,在本文章中,将继续完成剩下配置项的介绍。
ProducerConfig类
buffer.memory
重要性:高
类型:Long
默认值:33554432字节,即32M
producer可以用于缓存等待发送到服务端的消息记录的缓冲区大小,当消息记录发送到缓冲区的速度大于传输到server的速度,那么等待发送的消息记录将会放在缓冲区,缓冲区如果满了,那么producer会阻塞max.block.ms
指定的毫秒数,超过该毫秒数时,将抛出异常。
注意:该缓冲区的大小设置与整个producer需要使用到的producer大体一致,但是要注意并不是所有的缓冲区都是用来存放待发送的records的,比如还有一部分用于压缩数据(当压缩数据的选项开启),还有一部分用于维护in-flight
(正在发送)的请求列表。
retry.backoff.ms
重要性:低
类型:Long
默认值:100毫秒
当一个producer到指定的partition的请求request失败时,在重连之前,需要等待的毫秒数。这是为了避免在某些失败的场景下,过于密集地重复发送请求。
compression.type
重要性:高
类型:String
默认值:"none"
producer对数据使用的压缩类型,包括:
- none:无压缩类型
- gzip
- snappy
- lz4
producer在压缩数据时,是对所有batches的数据一起进行压缩,而不是一个batch一个batch压缩,所以,一次压缩的batches越多,压缩率越高,压缩效果越好。
metrics.sample.window.ms
重要性:低
类型:Long
默认值:30000毫秒,即30秒
计算度量样本的时间窗口,度量用于kafka监控。
metrics.num.samples
重要性:低
类型:int
默认值:2
维护用于计算度量metrics的样本数量。
metrics.recording.level
重要性:低
类型:String
默认值:info
用于metrics的最高纪录等级。
metric.reporters
重要性:低
类型:List
默认值:Collections.emptyList()
被作为metrics reporter的类的列表,这些类都实现了接口org.apache.kafka.common.metrics.MetricsReporter
,因此当有新的metric生成时,这些reporters类都可以接收到通知。通常都会包含JmxReporter类
,以用于注册JMX统计。
JMX(Java Management Extensions)
kafka使用jmx调取kafka broker的内部数据,来监控一些敏感的数据。
JMX相关资料:
从零开始玩转JMX(一)——简介和Standard MBean
从零开始玩转JMX(二)——Condition
从零开始玩转JMX(三)——Model MBean
从零开始玩转JMX(四)——Apache Commons Modeler & Dynamic MBean
max.in.flight.requests.per.connection
重要性:低
类型:int
默认值:5
在单个连接中,producer客户端在阻塞之前,可以允许未被确认的最大请求数,即当一个连接中未被确认的请求数超过了该设置,那么该producer客户端将会阻塞。注意:如果该值设置得比1大,当出现发送失败的情况,且retries
配置项又开启时,那么存在消息被重新排序的风险。
retries
重要性:低
类型:int
默认值:0,表示不重试
当该值被设置成大于0时,客户端会重新发送消息,并且记录发送失败的错误。注意,该重试配置项和客户端因收到错误而重发是一样的。当retries
配置项大于0,且max.in.flight.requests.per.connection
配置项的值大于1时,存在将重试记录重新排序的风险,也就是说,消息记录的顺序可能会被打乱。原因是:当两个batch被发送到同一个partition时,如果第一个失败,而第二个成功,那么第一个会被重试,此时第二个batch就排在前面了。
key.serializer
重要性:高
类型:Class
默认值:无
消息记录key的序列化类。
value.serializer
重要性:高
类型:Class
默认值:无
消息记录中value的序列化类。
connections.max.idle.ms
重要性:中
类型:Long
默认值:540000毫秒,即9分钟
如果一个连接空闲时间超过该配置值,那么该连接将会被关闭。
partitioner.class
重要性:中
类型:Class
默认值:无
计算消息记录要分配到哪个partitioner的类。在前面的文章【大数据实践】Kafka生产者编程(3)——Interceptor & Partitioner中,对partitioner有详细讲解。
interceptor.classes
重要性:低
类型:List
默认值: Collections.emptyList()
拦截链,在前面的文章【大数据实践】Kafka生产者编程(3)——Interceptor & Partitioner有详细讲解。
enable.idempotence
重要性:低
类型:Boolean
默认值:false
是否使用幂等性。如果设置为true,表示producer将确保每一条消息都恰好有一份备份;如果设置为false,则表示producer因发送数据到broker失败重试使,可能往数据流中写入多分重试的消息。
注意:如果使用idempotence,即enable.idempotence
为true,那么要求配置项max.in.flight.requests.per.connection
的值必须小于或等于5;配置项retries
的值必须大于0;acks
配置项必须设置为all。如果这些值没有被用户明确地设置,那么系统将自动选择合适的值。如果设置的值不合适,那么会抛出ConfigException
异常。
transaction.timeout.ms
重要性:低
类型:Int
默认值:60000毫秒,即60秒
在主动中止(aborting)一个事务transaction之前,事务协调员(transaction coordinator)最多等待的最长时间——为了让producer更新事务状态。如果该值大于kafka broker中设置的transaction.max.timeout.ms
配置项的值,那么producer 的请求将因为InvalidTransactionTimeout
错误而失败。
transactional.id
重要性:低
类型:String
默认值:null,表示transactions不能被使用
配置TransactionalId,用于事务的递交(delivery)。该配置项可以为跨多个producer的session提供可靠性语义,因为它可以保证在开始一个新的事务之前,使用相同事务ID(TransactionalId)的事务一定会完成。
注意:如果配置了transactional.id
的值,那么必须配置enable.idempotence
为true。在发布环境中,事务要求一个kafka集群必须有最少3个brokers(推荐设置)。在开发环境中,可以通过调整broker的配置项transaction.state.log.replication.factor
来进行调整,以方便开发。
小结
终于将producer的各个配置项过了一遍,通常我们需要关注的大概都是重要性为高的配置项。从上面的配置项中,我们也了解到一些新的概念,比如度量(metrics)
,事务transactions
等。这些概念可能会在接下来的文章中进行讲解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。