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<String, String> producer = new KafkaProducer<>(props);
 for(int i = 0; i < 100; i++)
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));

 producer.close();

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值