Kafka生产者的初始化

创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家!


        把用户配置的Kafka Producer参数,赋值给Kafka Producer构造函数中userProvidedConfigs变量。获取clientId。获取用户配置的分区器。

        获取用户配置的retry.backoff.ms,默认值100毫秒,该参数的意思是设置在重试发送消息之前等待的时间(以毫秒为单位)。当生产者发送消息到Kafka集群失败时,如果配置了重试(retries参数大于0),生产者会在每次重试前等待retry.backoff.ms配置的时间,然后再进行下一次重试。这个参数的存在目的是避免失败后立即重试导致无效操作和资源浪费。获得Key和Value的序列化器。设置拦截器。

        初始化metadata,kafka设计ProducerMetadata的目的,是管理生产者与kafka集群元数据交互。这个类主要负责:集群元数据的存储、元数据的更新、错误处理和重试机制、线程安全性。

        在构造ProducerMetadata对象时,有一个重要参数metadata.max.age.ms,默认值为300000毫秒,即5分钟。这个参数设置了元数据信息的最大存活时间(以毫秒为单位),一旦缓存的元数据信息的年龄超过了metadata.max.age.ms配置的值,生产者就会触发一次元数据的刷新操作,从kafka集群获取最新的元数据信息。

        设置max.request.size,默认值1048576字节,即1MB。这个参数设置了生产者发送请求到kafka集群时,单个请求到最大大小(以字节为单位)。实际生产环境中可以把这个参数设置的空间用一条信息填满,也可以用一批消息填满。合理设置这个参数,可以控制生产者发送请求的大小,避免发送过大的消息导致网络传输或kafka集群处理上的性能问题。

        设置buffer.memory,默认值33554432字节,即32MB。生产环境时,生产者的发送速度超过kafka集群的处理速度时,或者遇到网络问题导致消息受阻时,buffer.memory提供了一种机制来缓冲这些未发送的记录,从而避免生产者立即失败。

        设置compression.type,默认值none,不使用压缩。用于设置生产者发送消息时使用的压缩类型,通过压缩消息,可以在传输前减小消息的大小,从而减少网络传输的开销和存储需求。

        设置acks。acks指定了生产者在多少个分区副本收到消息的情况下才会认为消息写入成功。这个参数可以设置3个值。

  • acks=0

        生产者不会等待集群中任何broker的响应。这样设置,因为生产者对存储分区副本broker消息接收情况无感知,所以会出现消息丢失的可能。但是因为不需要broker响应,可以在网络支持的最大速度发送消息的前提下,最大限度的利用网络吞吐量。

  • acks=1

        只要集群的leader partition收到消息,生产者就会收到消息成功写入的响应。当遇到原来leader partition发生崩溃,新的leader partition还没有选举出来时,生产者会收到一个错误响应。这时为了避免数据丢失,生产者会尝试重发消息。ack=1,也是可能会出现丢失消息的情况。例如:leader partition有三个分区副本,其中一个分区成功收到了消息,还没有向另外两个leader partition分区的副本同步这条消息,这时拥有最新一条消息的broker崩溃了,另外两台候选leader partition的broker由于没有这条最新的一条消息,所以出现了消息丢失的情况。

  • acks=all

        只有当所有的副本全部收到消息时,生产者才会收到消息成功写入的响应。这种模式对于消息发送来说是最安全的,但是它的延迟也是最高的。

        设置max.block.ms。这个参数用于控制在调用send()或通过partitionsFor()显示地请求元数据时,遇到生产者发送缓冲区被填满,或者元数据不可用时,生产者可以发生阻塞的时间。当达到max.block.ms配置的时间时,就会抛出一个超时异常。

        设置delivery.timeout.ms。这个参数的使用场景是,kafka Producer调用send()后(即放入ProducerBatch类中thunks集合变量中),到broker响应或客户端放弃发送(包括重试)所花费的时间。这个配置时间应该大于linger.ms+request.timeout.ms之和。如果配置的时间不满足,则会抛出异常。

        设置request.timeout.ms。这个参数用于控制生产者在发送消息时等待服务器响应的时间。这是指一个请求等待响应的时间,如果在这个设置时间内没有收到响应,请求被视为超时。

        设置retries。用于控制生产者在放弃发送并向客户端宣告失败之前可以重试多少次。生产者不会重试所有的错误。像“消息太大”这种不是暂时的错误,生产者就不会进行重试。

你可能感兴趣的:(kafka,kafka,分布式)