kafka权威指南-第三章生产者问答式学习

本文详细介绍了Kafka生产者如何向主题发送消息,包括序列化、分区器的工作原理,以及生产者的必备属性和发送消息的三种方式。此外,还探讨了生产者配置调优的多个关键参数,如acks、buffer.memory等,并讨论了自定义序列化和分区策略。
摘要由CSDN通过智能技术生成

1.生产者是如何向kafka发送消息的?

这里写图片描述
(1)创建ProducerRecoder对象,该对象包含目标主题和要发送的内容,还可以指定分区和键
(2)发送之前,生产者将键和值对象序列化字节数组
(3)数据被传送到分区器,如果指定了分区,则直接返回指定的分区。如果没有指定分区,分区器会根据ProducerRecoder对象的键来选择一个分区。
(4)选好分区之后,生产者就知道该往哪个主题和分区发送该条记录,这条记录被添加到记录批次中,这个批次里面所有消息被发送到相同的主题和分区上。有一个独立的线程复制吧这些记录批次发送到相应的broker上。
(5)broker接收到这些消息,返回一个响应。如果消息成功写入Kafka,就返回一个RecordMetaData对象,包含主题,分区信息和记录在分区里面的偏移量。如果写入失败,返回一个错误信息,生产者在收到错误的消息之后会尝试重新发送消息,几次之后如果还是失败,就返回错误消息

2.生产者的必选属性有哪些?

(1)bootstrap.servers,该属性指定broker的地址清单,建议至少要提供两个brokker的信息
(2)key.serializer,该属性指定生产者实现把键序列化成字节数组
(3)value.serializer,指定类会将值序列化。

3.生产者发送消息有几种方式?

三种。
(1)发送并忘记
(2)同步发送,使用send发送消息,会返回一个Future对象,调用get()方法进行等待
(3)异步发送,调用send方法,并指定一个回调函数,服务器在返回相应的时候调用该函数

4.生产者怎么通过配置进行调优?

(1)acks,指定必须有多少个分区副本收到消息,acks=0、1、all对信息丢失和性能
影响都是不一样的
(2)buffer.memony,设置生产者内存缓冲区的大小
(3)copression.type,默认情况下,消息发送时不会被发送,提供snappy, gzip, lz4三种压缩。snappy压缩算法由google发明,占用较少的cpu,却能够提供较好的性能和相当可观的压缩比,如果比较关注性能和网络带宽,可以使用这种算法。gzip压缩算法一般会占用较多的CPU,但会提供更好的压缩比,如果网络带宽受限制,可以使用这种算法。压缩可以降低网络传输开销和存储开销,往往是发送消息的瓶颈所在。
(4)retries,该参数指定重发的次数,重试等待间隔是100ms,可以通过retry.backoff.ms参数来改变这个时间间隔。
(5)batch.size,批次的大小。设置的很大也不会造成延迟,只是会占用更多的内存。如果设置太小,生产者需要更频繁发送消息,增加额外开销。
(6)linger.rms,该参数指定了生产者在发送批次之前等待更多消息加入批次的时间。设置的大了,增加延迟,提升吞吐量。
(7)client.id,可以是任意字符串,服务器用它来识别消息的来源
(8)max.in.flight.requests.per.connection,该参数指定了生产者在收到服务器响应之前可以发送多少个消息。值越高,占用越多的内存,提升了吞吐量
(9)timeout.ms、request.timeout.ms和metadata.fetch.timeout.ms,timeout.ms指定了生产者在发送消息时等待服务器响应的时间。metadata.fetch.timeout.ms指定了生产者获取元数据时等待服务器响应的时间。timeou.ms指定broker等待同步副本返回消息确认的时间,与asks的配置相匹配。
(10)max.block.ms,该参数指定了在调用send()方法或使用partitionsFor()方法获取元数据时生产者的阻塞时间。
(11)max.request.size,该参数用于控制生产者发送的请求大小。可以指能发送的单个消息的最大值,也可以指定单个消息里所有消息总的大小。
(12)receive.buffer.bytes和send.buffer.bytes,这两个参数分别指定了TCP socket接受和发送数据包的换乘区大小。

5.生产者是如何序列化键和值得对象?

有两种方式。
第一种,自定义序列化器,自定义序列化有很多局限。
第二种,使用已有的序列化器和反序列化器,比如JSON,Avro、Thrift或Protobuf。比如Avro,,是一种与编程语言无关的序列化格式。Avro数据是通过与语言无关的schema来定义,schema通过json来描述,数据被序列化成二进制文件或Json文件,不过一般推荐使用二进制文件。在使用过程中,设置value.serializer为所定义的avroSerializerJ。

6.分区器是如何进行分区的?

(1)使用分区器。分区器使用了键,相同的键的消息将被写到同一个分区,也就是说,如果一个进程只从一个主题的分区读取数据,那么相同键的所有记录都会被该进程读取。
如果键值设为null, 并且使用默认的分区器,那么记录将会被随机地发送到主题内各个可用的分区上。分区器使用轮询算法将消息均衡地分布在各个分区上。
如果键值不为空,并且使用默认的分区器,那么kafka会对键进行散列,然后根据散列值把消息映射到特定的分区上。这里关键在于,同一个键总是被映射到同一个分区上,所以在进行映射时,我们会使用主题的所有的分区,而不仅仅是可用的分区。这意味着,如果写入数据的分区是不可用的,你们就会发生错误。

只有在不改变主题分区数量的情况下,键和分区之间的映射才回保持不变。
(2)实现自定义分区策略,使用自定义分区策略处理一些特殊情况,比如某个键的数据量特别多,可以使用自定义的分区策略对该键的数据进行分区,对其他键还可以使用散列分区算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值