mysql作为kafka生产者_Kafka之生产者

[TOC]

从编程的角度而言,生产者就是负责向 Kafka 发送消息的应用程序。在 Kafka 的历史变迁 中, 一共有两个大版本的生产者客户端: 第-个是于 Kafka开源之初使用 Scala语言编写的客户 端,我们可以称之为旧生产者客户端(OldProducer)或 Scala版生产者客户端;第二个是从 Kafka 0.9.x 版本开始推出的使用 Java 语言编写的客户端,我们可以称之为新生产者客户端( New Producer)或 Java 版生产者客户端,它弥补了 旧版客户端中存在的诸 多设计缺陷

虽然Kafka是用 Java/Scalai吾言编写的,但这并不妨碍它对于多语言的支持,在 Kafka官网中,“CLIENTS”的入口 l提供了一份多语言的支持列表,其中包括常用的CIC++、 Python、 Go等语 言 ,不过这些其他类语 言 的客户端并非由 Kafka社区维护,如果使用则需要另行下载 。本章主要针对现下流行的新生产者 CJava语言编写的)客户端做详细介绍,而旧生产者客户端己被湖汰, 故不再做相应的介绍了。

客户端开发

一个正常的生产逻辑需要具备以下几个步骤 :

(1 )配置生产者客户端参数及创建相应的生产者实例。

(2)构建待发送的消息 。

(3 )发送消息。

(4)关闭生产者实例。

代码清单 1-2 中己经简单对生产者客户端 的编码做了 一个基本演示 如代码清单 2-1 所示 。

public class KafkaProducerAnalysis {

public static final String brokerList = "localhost:9092";

public static final String topic = "topic-demo";

public static Properties initConfig() {

Properties props = new Properties();

props.put("bootstrap.servers", brokerList);

props.put("key.serializer",

"org.apache.kafka.common.serialization.StringSerializer");

props.put("value.serializer",

"org.apache.kafka.common.serialization.StringSerializer");

props.put("client.id", "producer.client.id.demo");

return props;

}

public static Properties initNewConfig() {

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);

props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,

"org.apache.kafka.common.serialization.StringSerializer");

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,

"org.apache.kafka.common.serialization.StringSerializer");

props.put(ProducerConfig.CLIENT_ID_CONFIG, "producer.client.id.demo");

return props;

}

public static Properties initPerferConfig() {

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);

props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,

StringSerializer.class.getName());

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,

StringSerializer.class.getName());

return props;

}

public static void main(String[] args) throws InterruptedException {

Properties props = initConfig();

KafkaProducer producer = new KafkaProducer<>(props);

// KafkaProducer producer = new KafkaProducer<>(props,

// new StringSerializer(), new StringSerializer());

ProducerRecord record = new ProducerRecord<>(topic, "hello, Kafka!");

try {

producer.send(record);

// producer.send(record, new Callback() {

// @Override

// public void onCompletion(RecordMetadata metadata, Exception exception) {

// if (exception == null) {

// System.out.println(metadata.partition() + ":" + metadata.offset());

// }

// }

// });

} catch (Exception e) {

e.printStackTrace();

}

// TimeUnit.SECONDS.sleep(5);

}

}

这里有必要单独说明的是构建的消息对象 ProducerRecord,它并不是单纯意义上的消息, 它包含了多个属性 , 原本需要发送的与业务 相 关的消息体只是其 中 的一个 value 属性 ,比 如 “ Hello, Kafka!”只是 ProducerRecord对象中的一个属性。 ProducerRecord类的定义如下(只截

取成员变量) :

public class ProducerRecord {

private final String topic;

private final Integer partition;

private final Headers headers;

private final K key;

private final V value;

private final Long timestamp;

川 省略其他成员方法和构造方法

}

其中 topic 和 partition 字段分别代表消息要发往的主题和分区号。 headers 字段是 消息的头部, Kafka 0.11.x 版本才引入这个属性,它大多用来设定 一些与 应用相关的信息,如无 需要也可以不用设置。 key 是用来指定消息的键,它不仅是消息的附加信息,还可以用来计算 分区号进而可以让消息发往特定的分区。前面提及消息以主题为单位进行归类,而这个 key 可 以让消息再进行二次归类,同 一个 key 的消息会被划分到同一个分区中,value 是指消息体, 一般不为空, 如果为空则表示特定的消息一一墓碑消息,timestamp 是指消息的时间戳, 它有 CreateTime 和 LogAppendTime 两种类型,前者表示消息创建的时间,后者表示消息追加到日志文件的时间。

2.1.1 必要的参数配置

在创建真正的生产者实例前需要配置相应的参数,比如需要连接的 Kafka集群地址。参照代码清单 2-1 中的 initConfig()方法,在 Kafka 生产者客户端 KatkaProducer 中有 3 个参数是必填的。

bootstrap.servers:该参数用来指定生产者客户端连接 Kafka 集群所需的 broker地址清单,具体的内容格式为hostl:portl,host2:port2,可以设置一个或多个 地址,中间以逗号隔开,此 参数 的默认值为“” 。 注意这里并非需要所有的 broker 地 址,因为生产者会从给定的 broker 里查找到其他 broker 的信息 。不过建议至少要设置 两个以上的 broker 地址信息,当其中任意 一个岩机时,生产者仍然可以连接到 Kafka 集群上。

key. serializer 和 value . serializer: broker 端接收的消息必须以字节数组 (byte[])的形式存在。代码清单 2-1 中生产者使用的 KatkaProducer和 ProducerRecord中的泛型 对应 的就是消息中 key 和value 的类型,生产者客户端使用这种方式可以让代码具有良好 的可读性 ,不过在发 往 broker之前需要将消息中对应的 key 和 value 做相应的序列化操作来转换成字节 数组。 key . serial工zer 和 value .serializer 这两个参数分 别用来指定 key 和 value 序列化操作 的序列化器,这两个参数无默认值。注意这里必须填写序列化器的 全限定名 ,如代码清单 2-1 中的org.apache.kafka.common.serialization.StringSerializer, 单单指定 StringSerializer是错误的

注意到代码清单 2-1 中的 initConfig()方法里还设置了 一个参数 client.id,这个参数用来 设定 KafkaProducer 对应的客户端 id, 默认值为“” 。

注意到代码清单 2-1 中的 initConfig()方法里还设置了 一个参数 client.id,这个参数用来 设定 KafkaProducer 对应的客户端 id, 默认值为“” 。 如果客户端不设置, 则 KafkaProducer 会 自动生成一个非空字符串,内容形式如“producer-I”“producer-2”

KafkaProducer 中的参数众多,远非示例 initConfig()方法 中的那样只有 4 个,开发人员可以 根据业务应用的实际需求来修改这些参数的默认值,以达到灵活调配的目的。一般情况下,普 通开发人员无法记住所有的参数名称,只能有个大致的印象。在实际使用过程中,诸如

“ key.serializer”“max.request.size” “interceptor.classes” 之类的字符串经常 由于人为因素而书 写错误。为 此,我们可以 直接使用客户端中的 org.apache.kafka.clients.producer.ProducerConfig 类来做一定程度上的预防措施,每个参数在 ProducerConfig 类中都有对应 的名称,以代码清单 2-1 中的 initConfig()方法为例 ,引入 ProducerConfig 后的修改结果如 下:

public static Properties initNewConfig() {

Properties props = new Properties();

props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);

props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,

"org.apache.kafka.common.serialization.StringSerializer");

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,

"org.apache.kafka.common.serialization.StringSerializer");

props.put(ProducerConfig.CLIENT_ID_CONFIG, "producer.client.id.demo");

return props;

}

注意到上面的代码中 key . serializer 和 value . serializer 参数对应类 的全限定名 比较长,也比较容易写错, 这里通过 Java 中的技巧来做进一步的改进, 相关代码如下:

props.put (ProducerConfig . KEY_SERIALIZER_CLASS_CONFIG , StringSerializer .class.getName());

props.put(ProducerConfig .VALUE SERIALIZER CLASS CONFIG, StringSerializer .class .getName()) ;

如此代码便简洁了许多,同时进一步降低了人为出错的可能性。在配置完参数之后,我们就可以使用它来创建一个生产者实例,示例如下:

KafkaProducer producer= new KafkaProducer<>(props) ;

Kaf

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值