kafka-producer生产者到底是怎么工作的?

本文详细介绍了Kafka Producer的工作流程,包括如何确定消息发送的分区,生产者的代码实现,构造Producer实例的步骤,以及关键参数的配置。同时,讨论了自定义分区策略和序列化方法,以及单线程和多线程环境下Kafka实例的使用。文中还提到了消费者组的概念和位移管理,强调了消费者组在处理消息传递和容错中的作用。
摘要由CSDN通过智能技术生成

1,producer 工作流程:

producer 的功能就是向某个 topic 的某个分区发送一条消息,所以首先要确定的就是向哪个分区发送,kafka 支持自动分配分区,也支持开发者自己指定分区。

分区是通过 Partitioner(分区器) 实现的,默认的分区器会看消息是否有 key

  • 如果有key,就计算key的hash值,然后对总分区数求模得到消息要被发送到的目标分区号。
  • 如果没有key,会选择轮询的方式在各个分区上均匀分配。

2,producer 代码流程:

Producer首先使用一个线程(用户主线程,也即用户启动Producer的线程)将待发送的消息封装进一个ProducerRecord类实例,然后将其序列化之后发送给partitioner,再结合本地缓存的元数据信息由partitioner来确定目标分区后一同发送到位于producer程序中的一块内存缓冲区中。而KafkaProducer中的另一个专门的sender I/O线程则负责实时地从该缓冲区中提取出准备就绪的消息封装进一个批次(batch),统一发送给对应的broker。

3、构造producer实例大致步骤

1)构造一个java.util.Properties对象,然后至少指定bootstrap.servers 、key.serializer、value.serializer这三个属性。对于bootstrap.servers参数,若kafka集群中机器数很多,可只需指定部分broker即可,producer会通过该参数找到并发现集群中所有的broker。而kafka接收到的消息都是字节数组,所以对于key和value,必须先进行序列化,使用全限定包名“org.apache.kafka.common.serialization.StringDeserializer“,

2)构造KafkaProducer对象

3)构造待发送的消息对象ProducerRecord,指定消息要被发送到的topic、分区及对应的key和value。注意,分区和key信息可以不用指定,有kafka自行确定分区

4)调用KafkaProducer的send方法发送消息。

5)关闭KafkaProducer。producer程序结束时一定要关闭producer。提供有无参数的close方法和有超时参数close方法。在实际场景中,一定要慎用待超时参数的close方法。关闭原因是producer开了额外线程和socket连接等,必须要将其关闭,避免占用较多资源

4,生产者具体代码

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.errors.RetriableException;

import java.util.Properties;
import java.util.concurrent.TimeUnit;

/*

 */
public class ProducerTest {

    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");//指定发往哪台broker服务器
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringDeserializer");//kafka发送给broker端的数据必须是字节数组
        //所以kafafka首先对消息进行序列化,然后才能发送给broker
        props.put(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值