kafkaProducer

kafkaProducer说明

  1. producer是线程安全的(consumer不是线程安全的),多个线程共享一个producer是推荐的.
  2. send()方法是异步的,把单个的记录变成一批发送提高效率.
  3. acks 请求完成的标准 all阻塞直到记录完全commit(所有的broker都收到消费),最慢但最可靠的
  4. 如果请求失败,producer可以自动发送(props.put(“retries”, 0) 0表示不重试),开启重试也就会有数据重复的可能性.(see ++http://kafka.apache.org/documentation.html#semantics++ for details)
  5. producer为每个分区维持没发送的记录的buffer(java.nio里面的),buffers的大小指定通过 batch.size配置,配置大一
    点导致一个批更大,但是需要更多内存(通常是每个分区有一个buffer),默认情况下,即使buffer还有空间,buffer也可以
    立即发送,如果你想减少请求的数量,你可以设置 linger.ms(等待时间)大于0,这将导致producer在发送请求之前等待配置的时间,
    ,为了更多的请求能够到达填充相同的batch,这是一个类型Nagle的算法,有时候是0,相近到的记录也会一起发送,在高负载的情况下,可以忽略linger配置,将其设置为大于0的,当不是在最大负载下,
    会导致更少、更有效的请求,以少量的延迟为代价
  6. buffer.memory控制生产者buffer可用内存的总量,如果记录被发送太快超过它们被发送到server,导致buffer空间被
    用完,当Buffer空间被用完,send调用将会阻塞,阻塞的时间是由 max.block.ms决定的,超过会抛出异常.
    The key.serializer and value.serializer 决定如何转用户提供的key和value对象到bytes,你可以用
    org.apache.kafka.common.serialization.ByteArraySerializer 或org.apache.kafka.common.serialization.StringSerializer
    来转换 简单的 string 或者 byte 类型.

示例代码


 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("acks", "all");
 props.put("retries", 0);
 props.put("batch.size", 16384);
 props.put("linger.ms", 1);
 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 producer = new KafkaProducer<>(props);
 for(int i = 0; i < 100; i++)
     producer.send(new ProducerRecord("my-topic", Integer.toString(i), Integer.toString(i)));

 producer.close();

kafka producer 的发送是异步的,还有另一个线程(Sender)发送数据.相当于消费者
kafkaProducer_第1张图片

producer与sender线程之间的队列(它们之间也构成了一种生产者,消费者关系)kafkaProducer_第2张图片

你可能感兴趣的:(kafka源码)