zoukankan      html  css  js  c++  java
  • apache kafka系列之Producer处理逻辑

     最近研究producer的负载均衡策略,,,,我在librdkafka里边用代码实现了partition 值的轮询方法,,,但是在现场验证时,他的负载均衡不起作用,,,所以来找找原因;
    下文是一篇描写kafka处理逻辑的文章,转载过来,研究一下.

    apache kafka系列之Producer处理逻辑

    标签: Kafka ProducerKafka Producer处理逻辑kafka生产者处理逻辑apache kafka系列
     分类:
     

    目录(?)[+]

     

    apache kafka中国社区QQ群:162272557

    转载自同事(董重)写得一篇wiki博客

    Kafka Producer处理逻辑

    Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护。

    Kafka结构图

    Kafka Producer默认调用逻辑

    默认Partition逻辑

    1、没有key时的分发逻辑

    每隔 topic.metadata.refresh.interval.ms 的时间,随机选择一个partition。这个时间窗口内的所有记录发送到这个partition。

    发送数据出错后也会重新选择一个partition

    2、根据key分发

    对key求hash,然后对partition数量求模

    Utils.abs(key.hashCode) % numPartitions

    如何获取Partition的leader信息(元数据)

    决定好发送到哪个Partition后,需要明确该Partition的leader是哪台broker才能决定发送到哪里。

    具体实现位置

    kafka.client.ClientUtils#fetchTopicMetadata

     实现方案

    1、从broker获取Partition的元数据。由于Kafka所有broker存有所有的元数据,所以任何一个broker都可以返回所有的元数据

    2、broker选取策略:将broker列表随机排序,从首个broker开始访问,如果出错,访问下一个

    3、出错处理:出错后向下一个broker请求元数据

    注意

    • Producer是从broker获取元数据的,并不关心zookeeper。
    • broker发生变化后,producer获取元数据的功能不能动态变化。
    • 获取元数据时使用的broker列表由producer的配置中的 metadata.broker.list 决定。该列表中的机器只要有一台正常服务,producer就能获取元数据。
    • 获取元数据后,producer可以写数据到非 metadata.broker.list 列表中的broker

    错误处理

    producer的send函数默认没有返回值。出错处理有EventHandler实现。

    DefaultEventHandler的错误处理如下:

    • 获取出错的数据
    • 等待一个间隔时间,由配置 retry.backoff.ms 决定这段时间长短
    • 重新获取元数据
    • 重新发送数据

    出错重试次数由配置 message.send.max.retries 决定

    所有重试全部失败时,DefaultEventHandler会抛出异常。代码如下

    if(outstandingProduceRequests.size >0) {

      producerStats.failedSendRate.mark()

      val correlationIdEnd = correlationId.get()

      error("Failed to send requests for topics %s with correlation ids in [%d,%d]"

        .format(outstandingProduceRequests.map(_.topic).toSet.mkString(","),

        correlationIdStart, correlationIdEnd-1))

      thrownewFailedToSendMessageException("Failed to send messages after "+ config.messageSendMaxRetries +" tries.", null)

    }


    请注明转载自:http://write.blog.csdn.NET/postedit/26687109

  • 相关阅读:
    JS判断是否是ioS或者Android
    React+dva多图片上传
    Nginx的虚拟主机
    Nginx的动静分离
    Nginx的负载均衡
    Nginx的静态代理
    Java内存模型
    系统学习笔记漏掉的部分
    异常的统一处理
    webpack学习指南
  • 原文地址:https://www.cnblogs.com/the-tops/p/6473168.html
Copyright © 2011-2022 走看看