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的进程

    然后监听删除命令

  建议:

    

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

 
 
 

    

  

  

原文地址:https://www.cnblogs.com/juncaoit/p/13508113.html