0
点赞
收藏
分享

微信扫一扫

kafka的面试问题

飞鸟不急 2021-09-25 阅读 85




kaka的特点
1 kafka主要做分布式消息处理平台,吞吐量非常的高,但是有发布订阅的功能,所有可以
作为消息队列处理
2 并不保证消息有序,保证topic中某个partition的消息有序,不同的partition不保证
消息有序,其他的mq保证先进先出
3 kafka提供了offset的管理,就是在日志文件中记录,如果不触发清理的机制,数据一致存在,可以重复消费,其他的mq消息消费后会被删除

kafka吞吐量大


parition机制实现同步发送机制
数据存入的时候会被压缩,批量发送接收节省网络传输的时间

kafka的底层原理之日志




每一条消息的组成结构




磁盘顺序读写有时候比内存读写快10-100倍有可能







当日志文件达到阈值的情况下,会分成新的segement

kafka零拷贝


使用了sendFile机制



使用这种机制把经过应用程序上下文切换去掉,
四步读取内容切换成2步骤
直接从内存缓冲区读取内容

消费者和消费者组


一个partition不能被多个消费者消费

producer客户端


会启动2个线程
1 守护线程
2 发送线程 网守护线程追加队列,由守护线程发送消息


Kafka消息发送流程

1. 简单流程概述

  A. 流程描述

a. producer先从zookeeper的"/brokers/.../state"节点找到该partition的leader
    b. producer将消息发送给该leader
    c. leader将消息写入到本地的log
    d. follower从leader拉取消息,写入本地的log后向leader发送ack
    e. leader收到ISR中的replica的ack后,增加HW(high watermark,最后commit的offset)并向producer发送ACK。

2. 消息发送的方式

Kafka的Producer发送消息采用的是异步发送的方式,且在新版的Kafka ApI中只有异步的发送方式。

但是可以通过异步发送的API达到同步的效果。

3. Kafka发送消息的具体流程

在消息发送过程中,涉及到两个线程,以及一个线程共享变量-RecordAccumulator.

两个线程:

一是主线程,负责将消息进行封装和加工发送给消息中间件(RecordAccumulator)

二是send线程,负责从消息中间件中拉取数据发送到主题(Topic)的对应分区(Partition)

A. 流程描述

main线程

a. 生产将要发送的数据封装成ProducerRecord对象,目的是发送到消息中间件

b. 中间要经过拦截器列表、序列化器和分区器将消息发送到消息中间件

c. RecordAccumulator中有多个队列,与topic的分区相对应。消息发送时直接发送到分区对应的RecordAccumulator队列中

sender线程

d. 当RecordAccumulator中攒够一批数据后,即达到指定量的数据之后,Sender线程将这一批数据拉取并发送给Topic。

控制参数:batch.size=>只有数据积累到batch.size之后,sender才会发送数据。

e. 同时,如果RecordAccumulator中队列迟迟到不到指定量的数据时,会等到一定时长时发送。

控制参数:linger.ms=>如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据

4. Kafka的重试机制


单topic单partition 影响吞吐量和消费者数量
业务有序:订单系统,用户行为追踪(userID offset的前后顺序来区分用户行为的前后)

kafka topic的删除


在创建topic的时候会在zookeeper创建节点变化的监听器和气筒删除topic的线程
,当执行删除命令的时候,会添加节点/admin/delete_topics/topic_name,触发了节点变化监听器,此时阻塞并等待的删除线程会被唤醒,执行删除topic的操作



实际环境中,删除前最好停掉kafka的服务

举报

相关推荐

0 条评论