Kafka(4)——第三章:Kafka 生产者——向kafka写入数据

一、生产者概览

1.1 先举个例子

在一个信用卡事务处理系统里,有一个客户端应用程序,它可能是一个在线商店,每当又支付行为发生时,它负责把食物发送到 Kafka 上。另一个应用程序根据规则引擎检查这个事物,决定是批准还是拒绝。批准或者拒绝的响应消息被写回Kafka,然后发送给发起食物的在线商店。第三个应用程序从Kafka 上读取事物和审核状态,把它们保存到数据库,随后分析师可以对这些结果进行分析,或许还能借此改进规则引擎。

1.2 Kafka 发送消息的主要步骤

Kafka(4)——第三章:Kafka 生产者——向kafka写入数据_第1张图片
我们从创建一个 ProducerRecord 对象开始,ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以指定键和分区。在发送 ProducerRecord 对象时,生产者要先把键值对象序列化成字节数组,这样它们才能够在网络上传输。

接下来,数据被传给分区器。如果之前在 ProducerRecord 对象 里指定了分区,那么分区器就不会再做任何事情,直接把指定的分区返回。如果没有指定分区,那么分区器会根据 ProducerRecord 对象的键来选泽一个分区。选好分区之后,生产者就知道该往哪个主题和分区发送这条记录了。紧接着,这条记录被添加到一个记录批次里,这个批次里的所有消息会被发送到相同的主题和分区上。有一个独立的线程负责把这些记录批次发送到相应的 broker 上。

服务器再收到这些消息时会返回一个响应。如果消息成功写入 Kafka,就返回一个 RecordMetaData对象,它包含了主题和分区信息,以及记录在分区里的偏移量。如果写入失败,则会返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后如果还是失败,就返回错误信息。

二、生产者配置

要往Kafka 写入消息,首先要创建一个生产者对象,并设置一些属性。Kafka 生产者有3个必须设置的属性。

  • 【属性一】bootstrap.servers

    • 该属性指定 broker 的地址清单,地址的格式为:host:port。生产者不需要包含所有的 broker地址,生产者会从给定的 broker 里查找到其他 broker 的信息。不过建议至少要提供两个 broker 的信息,一旦其中一个宕机,生产者仍然能够连接到集群上。
  • 【属性二】key.serializer

    • broker 希望接收到的消息的键和值都是字节数组。生产者接口允许使用参数化类型,因此可以把Java对象作为键和值发送给 broker。这样的代码具有良好的可读性。 key.serializer 必须被设置为一个实现了 org.apache.kafka.common.serialization.Serializer 接口的类,生产者会使用这个类把键对象序列化成字节数组。
  • 【属性三】value.serializer

    • 与key.serializer 一样,value.serializer 指定的类会将值序列化。如果键和值都是字符串,可以使用与key.serializer 一样的序列化器。如果键是整数类型而值是字符串,那么需要使用不同的序列化器。

Kafka(4)——第三章:Kafka 生产者——向kafka写入数据_第2张图片

三、发送消息到kafka

实例化生产者对象之后,接下来就可以开始发送消息了。发送消息一共有3种方式。

  • 【方式一】发送并忘记

    • 我们把消息发送给服务器,但并不关心它是否正常到达。使用这种方式有时候会丢失一些消息。
  • 【方式二】同步发送

    • 我们使用 send()方法发送消息,它会返回一个 Future 对象,调用 get() 方法进行等待,就可以知道消息是否发送成功。
  • 【方式三】异步发送

    • 我们调用 send()方法,并指定一个回掉函数,服务器在返回响应时调用该函数。

3.1 同步发送

在这里插入图片描述

  • 【步骤一】producer.send() 方法先返回一个 Future 对象,然后调用 Future 对象的get()方法等待 Kafka响应。如果服务器返回错误,get() 方法会抛出异常。如果没有发生错误,我们会得到一个 RecordMetadata对象,可以用它获取消息的偏移量。

3.2 异步发送

假设消息在应用程序和Kafka集群之间一个来回需要 10ms。如果在发送完每个消息后都等待回应,那么发送100个消息需要1秒。但如果只发送消息而不等待响应,那么发送100个消息所需要的时间会少很多。

为了在异步发送消息的同时能够对异常情况进行处理,生产者提供了回调支持。

Kafka(4)——第三章:Kafka 生产者——向kafka写入数据_第3张图片

为了使用回调,需要一个实现了 org.apache.kafka.clients.producer.Callback 接口的类,这个接口只有一个onCompletion 方法。

如果 Kafka 返回一个错误, onCompletion 方法会抛出一个非空(not null)异常。这里我们只是简单地把它打印出来,但是在生产环境应该有更好的处理方式。

在发送消息时传进去一个回调对象。

四、序列化器

创建一个生产者对象必须指定序列化器。

如果发送到 Kafka 的对象不是简单的字符串或者整型,那么可以使用序列化框架来创建消息记录,如:Avro;或者使用自定义序列化器。

你可能感兴趣的:(Kafka,Kafka,生产者)