zoukankan      html  css  js  c++  java
  • kafka常见问题

    1.问题

      kafka的常见应用场景

      kafka与其他消息中间件的异同点

    2.回答

      概念:

        kafka是分布式的流处理平台

      特性:

        提供发布订阅及topic支持

        吞吐量高,但是不保证消息有序【因为取决于partition的消费情况】

        提供了offset的管理,可以消费历史数据。是日志管理机制导致的,因为是从日志文件中检索

    3.应用场景回答

      日志的收集或者流式系统

      消息系统

      用户活动跟踪或运营指标监控

    4.问题

      kafka为什么吞吐量大

      kafka为什么速度快

    5.回答

      存储方面:日志顺序读写和快速检索

      并行方面:partition机制

      发送与接受:批量发送接收及批量数据压缩机制

      原则:通过sendfile实现零拷贝原则

    6.问题

      kafka的底层日志原理

      

    7.回答

      日志格式:

        kafka的日志是以partition为单位进行保存

        日志目录格式为topic名称+数字

        日志文件格式是一个“日志条目”序列

        每条日志消息是油4字节整形与N字节消息组成

      

            CRC:用于校验消息内容。占4个字节 

            MAGIC:用于标识kafka版本,默认是1。占1个字节

            ATTRIBUTES:用于存储消息压缩使用的编码以及Timestamp类型。这个版本仅支持 gzip、snappy、lz4三种压缩格式。后三位如果是000则表示没有使用压缩,如果是001则表示是gzip压缩,如果是010则是snappy压缩,如果是011则是snappy压缩。第4位(从右数)如果为0,代表使用create time,如果为1代表append time。其余位保留。占1个字节

            TIMESTAMP:时间戳。占8个字节

            KEY_SIZE:用于标识KEY内容的长度K。占用4个字节

            KEY:存储的是KEY的具体内容。占用K个字节。

            VALUE_SIZE:主要标识VALUE的内容的长度V。占用4个字节。

            VALUE:消息的真实内容。占用V个字节



        

      日志分段

        每个partition的日志将会分为N个大小相等的segment中,方便检索

        每个segment中的消息数量不一定相等

        每个partition只支持顺序读写,因为随机读写速度慢

      

        如果命中全局的segmentList,则可以知道对应的segment

      segment的存储结构

        patition会将消息添加到最后一个segment上

        当segment达到一定阈值会flush到磁盘上,consumer的消息读取是读取的磁盘,在内存中的是读取不到的

        segment分为两个部分,index与log【里面是具体的数据】

      日志读操作

        

         比如:要查找绝对offset为7的Message:

          首先是用二分查找确定它是在哪个LogSegment中,自然是在第一个Segment中。

          打开这个Segment的index文件,也是用二分查找找到offset小于或者等于指定offset的索引条目中最大的那个offset。自然offset为6的那个索引是我们要找的,通过索引文件我们知道offset为6的Message在数据文件中的位置为9807。

          打开数据文件,从位置为9807的那个地方开始顺序扫描直到找到offset为7的那条Message。

        这套机制是建立在offset是有序的。索引文件被映射到内存中,所以查找的速度还是很快的。Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。

        

    8.问腿

      零拷贝

      

    9.回答 

    传统的读取文件数据并发送到网络的步骤如下:
    (1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存;
    (2)应用程序将数据从内核空间读入用户空间缓冲区;
    (3)应用程序将读到数据写回内核空间并放入socket缓冲区;
    (4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送。

      

      kafka的零拷贝

      

      解释:

      Java NIO对sendfile的支持就是FileChannel.transferTo()/transferFrom()。
        fileChannel.transferTo( position, count, socketChannel);
      把磁盘文件读取OS内核缓冲区后的fileChannel,直接转给socketChannel发送;底层就是sendfile。消费者从broker读取数据,就是由此实现。
     
    10.问题
      消费者与消费者组
     
    11.回答
      kafka消费者组是kafka消费的单位
      单个partition只能被消费者组中的某个消费者消费
      消费者组中的单个消费者可以消费多个partition
     
    12.问题
      kafka的客户端
     
    13.问题
      主要回答:
        处理流程
        启动的线程,一个核心线程,一个守护线程,在创建的时候就完成了。发送的时候,会新起一个线程,将数据发送到队列
     
      时序的说法:
        client发送send时,producer会将消息append到守护进程上,守护进程会在满足一定的情况下,将数据发送给服务端,然后获取future
        如果需要知道结果,可以使用get的方式,或者使用回掉的方式
      流程说法:
        会将数据进行序列化,然后调用分区器,分别在partion上建立发送批次
     
    14.问题
      怎么保证数据的有效性
     
    15.问题
      kafka的特性是只支持partition有序
      大部分使用:kafka key + offset可以做到业务有序
     
    16.问题
      topic删除背后做的事情
     
    17.回答
      
       

      主要从两条线来回答:

        首先是启动了删除topic的进程

        然后监听删除命令

      建议:

        

      最好是,输入流量进行控制,然后再删除

     
     
     

        

      

      

  • 相关阅读:
    net.sf.json.JSONException: There is a cycle in the hierarchy!
    数据源的配置
    java枚举使用详解
    hibernate级联保存,更新个人遇到的问题
    NonUniqueObjectException 问题
    No.2 dotnetcore&docker--数据库等在Docker上的配置
    No.1 dotnetcore&docker--环境搭建
    No.5 dotnetcore&docker--采用Ambry做文件服务器
    No.3 dotnetcore&docker--搭建一个nuget服务器
    关于APM数据采集实例以及Eureka整合的一个想法
  • 原文地址:https://www.cnblogs.com/juncaoit/p/13508113.html
Copyright © 2011-2022 走看看