目录
生产者
代码块
➊ 新建一个 Properties 对象。
➋ 因为我们打算把键和值定义成字符串类型,所以使用内置的 StringSerializer。
➌ 在这里我们创建了一个新的生产者对象,并为键和值设置了恰当的类型,然后把Properties 对象传给它。
private Properties kafkaProps = new Properties(); ➊
kafkaProps.put("bootstrap.servers", "broker1:9092,broker2:9092");
kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); ➋
kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<String, String>(kafkaProps); 3
发送并忘记(fire-and-forget) 我们把消息发送给服务器,但并不关心它是否正常到达。大多数情况下,消息会正常到 达,因为 Kafka 是高可用的,而且生产者会自动尝试重发。不过,使用这种方式有时候 也会丢失一些消息。
同步发送
我们使用 send() 方法发送消息,它会返回一个 Future 对象,调用 get() 方法进行等待, 就可以知道消息是否发送成功。
异步发送
我们调用 send() 方法,并指定一个回调函数,服务器在返回响应时调用该函数。
为了在异步发送消息的同时能够对异常情况进行处理,生产者提供了回调支持。下面是使 用回调的一个例子。
private class DemoProducerCallback implements Callback {➊ @Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (e != null) {
e.printStackTrace(); ➋ }
} }
ProducerRecord<String, String> record =
new ProducerRecord<>("CustomerCountry", "Biomedical Materials", "USA"); ➌
producer.send(record, new DemoProducerCallback()); ➍
➊ 为了使用回调,需要一个实现了 org.apache.kafka.clients.producer.Callback 接口的 类,这个接口只有一个 onCompletion 方法。
➋ 如果 Kafka 返回一个错误,onCompletion 方法会抛出一个非空(non null)异常。这里 我们只是简单地把它打印出来,但是在生产环境应该有更好的处理方式。
➌ 记录与之前的一样。
➍ 在发送消息时传进去一个回调对象。
1.Kafka使用Avro进行序列化,Avro是一个跨语言的序列化格式,可以快速处理大批量数据序列化,支持二进制和json序列化格式,一个二进制较多,Avro用schema定义格式,他也定义的xml的格式,他把schema嵌入到消息中,可以支持发送端修改schema后,不影响消费端的序列化解析。schema通过注册表,然后每个消息记录sch