// 创建kafka生产者的配置信息
Properties props = new Properties();
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
:broker接收消息必须以字节数组byte[]形式存在,KafkaProducer
//序列化
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
client.id
:这个参数用来设定kafkaProducer对应的客户端id,默认值为“”,如果不设置,会自动生成一个非空字符串,内容形式如:“producer-1”,“producer-2”…
acks
:这个参数用于指定分区中必须由多少个副本收到消息,之后生产者才会认为这条消息写入是成功的。acks参数有三种类型的值(都是字符串类型)。
acks=1
默认值为1.生产者发送消息之后,只要分区的leader副本成功的写入消息,生产端就会收到来自服务端的成功响应,说明发送成功。如果消息无法写入leader副本,比如在leader副本崩溃、重新选举新的leader副本的过程中,生产者就会收到一个错误的响应,为了避免消息丢失,生产者就会选择重发消息;如果消息写入leader副本并成功响应给生产者,并且在其他follower副本拉取之前leader副本崩溃,此时消息还会丢失,因为新选举的leader副本中并没有这条对应的消息。acks设置为1,是消息可靠性和吞吐量之间的这种方案。
acks=0
生产者发送消息之后,不需要等待任何服务端的响应。如果在消息从发送到写入kafka的过程中出现异常,导致kafka并没有收到消息,此时生产者是不知道的,消息也就丢失了。akcs设置为0时,kafka可以达到最大的吞吐量。
acks=-1
或acks=all
生产者在消息发送之后,需要等待isr中所有的副本都成功写入消息此案能够收到服务端的成功响应。acks设置为-1,可以达到相对最强的可靠性。但这不一定是最可靠的,因为isr中可能就只有leader副本,这样就退化成了acks=1 的情况。
注意,acks参数是一个字符串类型,而不是一个整数类型。配置错误会报异常。
// ack应答级别
props.put("acks", "all");
max.request.size
:生产者客户端能发送消息的最大值,默认值为1048576B,1MB。
不建议盲目修改,这个参数涉及其他的一些参数的联动,
比如broker端的message.max.bytes参数,如果broker的message.max.bytes参数设置为10,而max.request.size设置为20,当发送一条大小为15B的消息时,生产者参数就会报错。
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
:这个参数用来制动多久之后关闭限制的连接,默认值540000(ms),9分钟。
linger.ms
:这个参数用来指定生产者发送ProducerBatch之前等待更多的消息(ProducerRecord)假如ProducerBatch的时间,默认值为0。ProducerBatch在被填满或者时间超过linger.ms值时发送出去。增大这个参数的值回增加消息的延迟(消费端接收延迟),但能够提升一定的吞吐量。
// 等待时间
props.put("linger.ms", 1);
receive.buffer.bytes
:这个参数用来设置socket接收消息缓冲区的大小,默认值为32768(B),即32KB。如果设置为-1,则使用操作系统的默认值。如果Producer和Kafka处于不同的机房,则可以适当的调大这个参数值。
send.buffer.bytes
:这个参数用来设置socket发送消息缓冲区的大小,默认值为131072(B),即128KB。与receive.buffer.bytes参数一样,如果设置为-1,则使用操作系统的默认值。
request.timeout.ms
:这个参数用来配置Producer等待请求响应的最长时间,默认值为3000(ms)。请求超时之后可以选择进行重试。这个参数需要比broker端参数replica.lag.time.max.ms值要大,这样可以介绍因客户端重试引起的消息重复的概率。
enable.idempotence
:幂等性开启,默认为false。
bootstrap.servers
:broker集群地址,可以设置一到多个,建议至少设置为2个,若在应用程序启动的时候,一个broker节点宕机,还可以对另一个已提供节点进行连接。
partitioner.class
:显示配置使用哪个分区器。
interceptor.classes
:指定自定义拦截器,多个传List集合。
buffer.memory
:生产者客户端RecordAccumulator缓存大小,默认值为33554432B,即32M。
// RecordAccumulator 缓冲区大小
props.put("buffer.memory", 33554432);
batch.size
:ProducerBatch可以复用内存区域的大小
max.block.ms
:最大阻塞时间,RecordAccumulator缓存不足时或者没有可用的元数据时,KafkaProducer的send()方法调用要么被阻塞,要么抛出异常,此参数的默认值为60000,即60s。
metadata.max.age.ms
:当客户端超过这个时间间隔时就会更新元数据信息默认值300000,即5分钟。元数据指集群中有哪些主题,主题有哪些分区,每个分区leader副本在哪个节点上,follower副本在哪个节点上,哪些副本在AR,ISR等集合中,集群中有哪些节点等等。
compression.type
:指定消息的压缩方式,默认值为"none",可以配置为"gzip",“snappy”和“lz4”。
connections.max.idle.ms
:用来指定多久之后关闭闲置的连接,默认值540000(ms),即9min
max.in.flight.requests.per.connection
:限制每个连接,也就是客户端与Node之间的连接最多缓存请求数,默认值5
transactional.id
:设置事务id,必须唯一,默认值null
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