三, 生产者生产逻辑|小册免费学

117 阅读2分钟

完整的生产者的生产逻辑:

  • 配置生产者客户端参数及创建相应的生产者实例。
  • 构建待发送的消息。
  • 发送消息。
  • 关闭生产者实例。

构建消息

消息有以下几种参数

  • topic:必须字段,表示该消息记录record发送到那个topic。
  • value:必须字段,表示消息内容。
  • partition:可选字段,要发送到哪个分区partition。
  • key:可选字段,消息记录的key,可用于计算选定partition。
  • timestamp:可选字段,时间戳;表示该条消息记录的创建时间
  • createtime,如果不指定,则默认使用producer的当前时间。
  • headers:可选字段,消息头部。

消息的发送

发后既忘

发后既忘只负责保证kafka作为消息系统的基本的功能。但并不保证消息一定可以准确有序的送到消费者手中。在单线程情况下以及多线程但高可用的情况下,这种发送模式可以满足我们的使用需求,但在某些时候(比如发生不可重试异常时),出现这类问题时,我们不能保证消息会准确有序的到达。这种发送方式的实现简单,效率高,但我们没办法保证他的可靠性。

同步

KafkaProducer 的 send()方法是 Future类型,send()方法有2个重载方法,具体定义如下:

public Future<RecordMetadata> send(ProducerRecord<K, V> record)
public Future<RecordMetadata> send(ProducerRecord<K, V> record, 
                                   Callback callback)

我们使用send() 方怯发送消息, 它会返回Future对象,调用get() 方法进行等待,就可以知道悄息是否发送成功。示例如下:

  KafkaProducer kafkaProducer = new KafkaProducer(kafkaPropertie);
        //创建消息对象,第一个为参数topic,第二个参数为key,第三个参数为value
        ProducerRecord<String, String> record = new ProducerRecord<String, String>("testTopic","key1","hello world");

        //同步发送方式,get方法返回结果
        RecordMetadata metadata = (RecordMetadata) kafkaProducer.send(record).get();
        System.out.println("broker返回消息发送信息" + metadata);

实际上send() 方法本身就是异步的,send() 方法返回的 Future 对象可以使调用方稍后获得发送的结果。示例中在执行 send() 方法之后直接链式调用了 get() 方法来阻塞等待 Kafka 的响应,直到消息发送成功,或者发生异常。如果发生异常,那么就需要捕获异常并交由外层逻辑处理。

异步

send本身异步,但需要自己制定一个Callback回调函数

为什么直接用不行?

相较于刻意的等待1000ms,或者是像之前一样使用时阻塞在get()方法钟,不如直接用回调函数的方式,来实现异步后函数运行的逻辑。

文章末尾请带上以下文字及链接:本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情