Kafka基础-生产者发送消息

无论你是使用Kafka作为队列,消息总线还是数据存储平台,你都会用到生产者,用于发送数据到Kafka。下文介绍如何使用Java来发送消息到Kafka。

1. 发送消息的主要步骤

  • 首先创建ProducerRecord对象,此对象除了包括需要发送的数据value之外还必须指定topic,另外也可以指定key和分区。当发送ProducerRecord的时候,生产者做的第一件事就是把key和value序列化为ByteArrays,以便它们可以通过网络发送。
  • 接下来,数据会被发送到分区器。如果在ProducerRecord中指定了一个分区,那么分区器会直接返回指定的分区;否则,分区器通常会基于ProducerRecord的key值计算出一个分区。一旦分区被确定,生产者就知道数据会被发送到哪个topic和分区。然后数据会被添加到同一批发送到相同topic和分区的数据里面,一个单独的线程会负责把那些批数据发送到对应的brokers。
  • 当broker接收到数据的时候,如果数据已被成功写入到Kafka,会返回一个包含topic、分区和偏移量offset的RecordMetadata对象;如果broker写入数据失败,会返回一个异常信息给生产者。当生产者接收到异常信息时会尝试重新发送数据,如果尝试失败则抛出异常。

2. 创建生产者

发送数据到Kafka的第一步是创建一个生产者,必须指定以下三个属性:

  • bootstrap.servers:生产者用于与Kafka集群建立初始连接的主机和端口的列表。该列表不需要包括所有的brokers信息,因为生产者在建立连接后能够获取所有brokers的信息。但建议至少包含两个,防止一个broker宕机,生产者仍然能够通过另外一个broker连接到群集。
  • key.serializer:用于序列化keys的类名。Kafka brokers期待key和value的类型为byte数组,但是也允许使用参数化的Java对象作为key和value。这使得代码非常易读,但也意味着生产者必须知道如何把这些对象转换为byte数组。key.serializer应设为实现了org.apache.kafka.common.serialization.Serializer接口的类名,生产者将会使用这个类来把key对象序列化为byte数组。Kafka内置实现了ByteArraySerializer、StringSerializer和IntegerSerializer。注意,即使生产者发送的数据没有指定key,也必须设置key.serializer这个属性。
  • value.serializer:用于序列化value的类名。类似于key.serializer,生产者将会使用指定的类来把value对象序列化为byte数组。

下面是创建生产者的代码示例:

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. 发送消息

发送消息主要有以下三种方法:

3.1 Fire-and-forget

发送消息后不需要关心是否发送成功。因为Kafka是高可用的,而且生产者会自动重新发送,所以大多数情况都会成功,但是有时也会失败。

下面是代码示例:

ProducerRecord<String, String> record = new ProducerRecord<String, String>("CustomerCountry",
		"Precision Products", "France");
try {
	producer.send(record);
} catch (Exception e) {
	e.printStackTrace();
}

ProducerRecord有多个构造器,这里使用了三个参数的,topi

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Kafka生产者发送消息的源码比较复杂,下面简单介绍一下Kafka生产者发送消息的基本流程: 1. 创建生产者对象:首先,用户需要创建一个生产者对象,可以通过ProducerConfig类来设置生产者的配置参数,例如bootstrap.servers、acks、retries等参数,然后调用KafkaProducer构造函数创建生产者对象。 2. 发送消息生产者可以通过send()方法发送消息发送消息时需要指定消息所属的主题和分区,以及消息的key和value。Kafka的分区机制会根据消息的key进行分区,如果没有指定key,则会采用轮询的方式将消息分配到不同的分区中。发送消息时,生产者会将消息缓存到内存中,然后异步地将缓存中的消息发送Kafka broker。 3. 消息序列化:在发送消息之前,需要将消息进行序列化,将消息对象转换为字节数组。Kafka支持多种序列化方式,例如StringSerializer、ByteArraySerializer、AvroSerializer等,用户可以根据具体需求选择不同的序列化方式。 4. 等待发送结果:发送消息后,生产者会立即返回一个Future对象,用于异步获取发送结果。如果消息成功发送Kafka broker,Future对象的get()方法会返回一个RecordMetadata对象,包含消息所在的主题、分区和位移等信息;如果发送失败,get()方法会抛出一个ExecutionException异常。 Kafka生产者的源码比较复杂,涉及到多线程、网络IO、序列化和压缩等方面的知识,需要有一定的Java编程和网络编程基础。如果需要深入了解Kafka生产者的源码,可以参考Kafka的官方文档或者查看Kafka源代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值