文章目录
Kafka生产者——向Kafka写入数据
除了内置的客户端外,Kafka还提供了二进制连接协议,也就是说,我们直接向Kafka网络端口发送适当的字节序列,就可以从Kafka读取消息或往Kafka写入消息。因此还有好多语言实现的Kafka客户端,比如C++,Python,Go,不仅限于Java。
生产者概览
一个应用程序在很多情况下需要向Kafka写入消息:记录用户活动、保存日志信息、记录只能家电信息、与其他应用程序进行异步通信、缓冲即将写入数据库的数据,等等。
消息发送过程
尽管生产者API使用起来很简单,但消息的发送过程还是挺复杂的。
1)我们首先创建一个 ProducerRecord 对象开始,ProducerRecord 对象需要包含目标主题和要发送的内容,还可以指定键和分区。
2)在发送 PR 时,生产者需要先把键值对象序列化成字节数组,这样才能在网络上传输。
3)接下来,数据被传给分区器。如果 PR 中已经指定了分区,那么分区器就不会再做任何事情了,直接把指定的分区返回。如果没有,分区器则会根据 PR 中的键来选择一个分区。
4)紧接着,这条记录就会添加到一个记录批次里,这个批次的所有消息都会被发送到相同的主题和分区里。
5)之后,有一个独立的线程将这些记录批次发送给相应的broker上。
6)服务器在收到这些消息时会返回一个响应,如果消息发送成功写入Kafka中,就会返回一个 RecordMetaData 对象,它包含着主题和分区信息,以及记录在分区里的偏移量。
创建 Kafka 生产者
想要写入Kafka,首先要创建一个生产者对象,并设置一些属性。Kafka生产者有3个必选属性。
bootstrap.servers
该属性指定 broker 的地址清单,地址格式为:host:port。建议提供两个broker信息,其中一个宕机,生产者仍然能够连接到集群上。
key.serializer
broker希望接收到的消息的键值都是字节数组,不过生产者需要将键值所包装的Java对象转成字节数组。Kafka客户端默认提供 ByteArraySerializer、StringSerializer 和 IntegerSerializer 的序列化器。
value.serializer
如果键是整数类型而值是字符串,那么需要使用不同的序列化器。
Properties kafkaProps = new Properties();
kafkaProps.put("bootstrap.servers","hadoop102:9092,hadoop103:9092");
kafkaProps.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
kafkaProps.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String,String> producer = new KafkaProducer<String, String>(kafkaProps);
此时实例化生产者后,接下来就可以发送开始发送消息了。
发送消息有以下3种方式。
- 发送并忘记(fire-and-forget)
- 我们把消息发送给服务器,但并不关心它是否到达。
- 同步发送
- 我们使用send()方法发送消息,它会返回一个 Future 对象,调用 get() 方法进行等待,就可以知道消息是否发送成功了。
- 异步发送
- 我们调用 send() 发送,并指定一个回调函数,服务器在返回响应时会调用该函数。
//发送并忘记
producer.send(record);
//同步发送
try {
RecordMetadata metadata = producer.send(record).get();
Long offset = metadata