# kafka-design **Repository Path**: interview_44/kafka-design ## Basic Information - **Project Name**: kafka-design - **Description**: 面试用,用于介绍kafka的东东。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-02-15 - **Last Updated**: 2023-03-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # kafka-design #### 介绍 kafka学习 ### 1、kafka总览 ![](./picture/1-kafka总览.drawio.png) 每个broker为一个kafka进程,每个进程里面有多个partition -> 轻松横向扩容 有得可能是主,有得是从 -> 挂了可以主从切换 ### 2、leader选举 ![](./picture/2-leader选举.drawio.png) 由zookeeper管理服务器元数据,通过选举方式选择主partition。 由主partition同接收msg,然后发给从partition,所以为了防止数据不丢失,会在producer里面设置ack=all 一个partition只写入一个consumer ### 3、topic的原理 ![](./picture/3-topic.drawio.png) 在partition里面找消息 1、通过二分查找,先找到log文件。 2、然后再log文件里面用二分查找找offset消息。 3、拿到物理偏移量。 ### 4、log文件 log文件默认1G一个,可以文件大小调。 消息也可以调,不至于一个索引一个消息。稀疏的索引。 消息存放在log文件,查询消息是可以直接索引到log文件。 默认保留7天。 ### 5、生产者消息发布负载均衡 一、有key 1、msg的key不为空的情况下,拿到key的hash值。 2、拿到hash值根据partition的数量取余。 二、无key 轮询的方式,轮流向partition写入代码 ### 6、range策略:把消息分配给消费者consumer 一个topic可以有多个partition partition -> consumer 以consumer的个数为分段基础,把partition分多少段 然后均匀的把partition分给各个consumer ### 7、kafka的问题 1、partition分区越多,保存的文件越多,replicaManager需要打开的文件句柄越多。 2、partition分区越多,打开的读缓存越多,内存消耗太大。 3、partition分区越多,协调的压力越大。