kafka 生产者

本文详细介绍了 Kafka 生产者的工作原理,包括如何创建 ProducerRecord,数据的序列化方式,以及如何通过 Properties 配置生产者。讨论了分区策略,如键为 null 时采用的轮询算法,并提及了自定义序列化器和分区的可能性。
摘要由CSDN通过智能技术生成

kafka 生产者

在这里插入图片描述

  1. 创建一个包含目标主题和内容的 ProducerRecord 对象,可指定键或分区,发送前要把对象序列化成字符数组。
  2. 数据被传给分区器,如果指定了分区就直接把指定的分区返回。如果没有指定分区,分区器就根据 ProducerRecord 对象的键选择一个分区。紧接着这条记录就被添加到一个记录批次里,这个批次里所有的消息会被发送到相同的主题和分区上。
  3. 如果消息成功写入 kafka,就返回一个 PrcordMetaData 对象,包含了主题和分区信息,以及记录在分区的偏移量。如果写入失败,则会返回一个错误。生产者在收到错误之后会尝试重新发送消息,几次之后还是失败就会返回错误信息。

Properties

kafka 生产者有3个必选的属性

  • bootstrap.servers——broker 的地址清单:清单里不需要包含所有的 broker 地址,生产者会从给定的 broker 里查找到其它 broker 的信息。不过至少要提供两个 broker 的信息,一旦其中一个宕机,生产者仍然能连接到集群上。
  • key.serializer:一个实现了 org.apache.kafka.common.serialization.Serializer 接口的类,生成者会使用这个类把键对象序列化成字节数组。kafka 客户端默认 提供 ByteArraySerializer、StringSerializer、IntegerSerializer。
  • value.serializer:序列化值对象的类。

kafka 得到其它配置:

  • acks:指定了必须要有多少个分区副本收到消息,生产者才会认为消息写入是成功的。

    acks=0:生产者在成功写入消息之前不会等待任何来自服务器的响应。

    acks=1:只要集群的首领节点收到消息,生产者就会收到一个来自服务器的成功响应,否则会收到一个错误响应。如果一个没有收到消息的节点成为新首领,消息也会丢失。

    acks=all:只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。

  • buffer.memory:设置生产者内存缓冲区的大小。如果应用程序发送消息的速度超过发送到服务器的速度,send()方法要么阻塞,要么抛出异常,这取决于如何设置block.bufffer.full 参数(在0.9.0.0版本里被替换成了max.block.ms,表示在抛出异常之前可以阻塞一段时间)。

  • compression.type:指定了消息被发送给 broker 之前使用哪一种压缩算法压缩(默认不会被压缩)。该参数的值有 snappy、gzip、lz4,。

  • retires:决定了生产者可以重发消息的次数,如果达到了这个次数,生产者就会放弃重发并返回错误。默认情况下,生产者在每次重试之间等待100ms,不过可以通过retry.backoff.ms 参数改变这个时间间隔。

  • batch.size:指定了一个批次可以使用的内存大小,按照字节计算。

  • linger.ms:指定了生产者在发送批次之前等待更多消息加入批次的时间。KafkaProducer 会在批次填满或 linger.ms 达到的时候将批次发送出去。

  • client.id:该参数可以是任意字符串,服务器会用它来识别消息的来源,还可以在日期和配额指标里。

  • max.in.flight.requests.per.connection:指定了生产者在收到服务器响应之间可以发送多少个消息。

  • timeout.ms:指定了生产者在发送数据时等待服务器返回响应的时间。

  • request.timeout.ms:指定了生产者在获取元数据时等待服务器返回响应的时间,如果超时,那么生产者要么重试发送数据,要么返回错误。

  • metadata.fetch.timeout.ms:指定了 broker 等待同步副本返回消息确认的时间,与 asks 配置相匹配。

  • max.block.ms:指定了在调用 send() 方法或使用 partitionsFor() 方法获取元数据时生产者的阻塞时间。

  • max.request.size:用于控制生产者发送的请求大小,可以指能发送的单个消息的最大值,也可以指单个请求里所有消息总的大小。

  • receive.buffer.bytes:指定了 TCP socket 接收数据包的缓冲大小。

  • send.buffer.bytes:指定了 TCP socket 发送数据包的缓冲大小。

kafka 可以保证同一个分区里的消息是有序的。

序列化器

自定义序列化器

public class CustomerSerializer implements Serializer<CustomerBean> {
   
    @Override
    public void configure(Map<String, ?> map, boolean b) {
   
        // 不做任何配置
    }

    @Override
    // 进行序列化
    public byte[] serialize(String s, CustomerBean data) {
   
        try {
   
            byte[] serializedName;
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值