结构流程:
①生产者将消息写入主题topic
②topic将消息放入分区
③分区将消息存储,并发送给kafka broker(kafla节点)
④kafka节点将消息分发与关注了主题topic的各个消费者组
⑤消费者与消费者组签订reblance,平均分配分区信息,并且一个消费者组里面只能有一个消费者消费给主题的消息。
- kafka简介
答:
kafka是一个分布式、支持分区、多副本的、基于zookeeper协调的分布式消息系统。可以实时的处理大量数据以满足各种需求场景,用Scala语言编写的。
2.broker
答:
消息中间件处理节点,一个kafka节点就是一个broker,一个broker或者多个可以组成一个kafka集群。
3.topic
答:
主题,kafka根据topic对消息进行归类,发布到kafka集群的每一条消息都需要指定一个topic,保存于一个或者多个broker中,消费和生产只需要关注topic,无需要关注在哪里存储。
4.producer
答:
消息生产者,向broker发送消息的客户端,客户端都已record为一条消息进行发送,record包含一个键值对,分区和topic名,key值可以省略。
5.consumergroup
答:
消费者组,每一个消费者都有一个消费者组,一条消息可以发送多个不同的消费者组。但每一个消费者中只能有一个消费者消费该消息。
6.consumer
答:
消息消费者,从broker读取消息的客户端。
7.partition
答:
一个topic可以分为多个partition,每个partition都是有序的。
8.topic与partition之间关系
答:
在kafka中没一条消息都有有一个topic,一般来说,在我们应用中产生不同类型的数据都可以设置不同的主题,一个主题会有多个消息的订阅者。kafka为每个主题生成了维护分布式的分区日志文件,每个partition在kafka存储层面是append log,任何发布到此partition的消息都会追加到log文件尾部,在分区中每条消息都会按照时间顺序分配到一个单调递增的顺序编号,也就是我们的offset,可以通过offset可以确定一条在该partition下的唯一消息,在partition先保证了有序性,但在topic下面没有包子partition的有序性。
9.信息如何确定进行哪个分区?
答:
当没有key值时,生产者将消息放入主题中,主题会在各个分区进行轮询,分区占用少的,topic会将消息存储进去。消费者也必须从kafka进行轮询,以保证每一个消费者是否存活,如何死亡,分区会将消息分给同一个消费者组中的另一个成员;
如果存在key值,对key值进行hash取模,将同一个key值放入同一个分区,如果想队列的强顺序一致性,可以让所有的消息都设为同一个key值。 - kafka优势
答:
①解耦;②冗余;③扩展性好;④灵活性和峰值处理能力强;⑤可恢复性;⑥顺序保证;⑦缓存;⑧异步通信。 - kafka的特征
答:
①高吞吐量、低延迟;②可扩展性;③可靠性;④容错性;⑤高并发。
12.reblance
答:
本质是一种协议,规定了一个consumer group中的consumer如何达成一致,来分配订阅topic的每个分区。
13.rebalance触发条件
答:
①组员个数发生变化;②订阅topic发生变化;③topic分区发生变化。
14.partition组件
答:
每个partition分为多个segment,每个segment有.log和.index两个文件,每个log文件承载具体的数据,每条消息都有一个递增的offset,。Index文件是对log文件的索引,consumer查找offset时使用的是二分法根据文件名去定位到哪一个segment,然后解析msg,匹配到对应的offset的msg。 - kafka缓存策略
答:
①kafka以topic来进行消息管理,每个topic包含多个partition,每个partition对应一个逻辑log,有多个segment组成;
②每个segment中存储多条消息(见下图),消息id由其逻辑位置决定,即从消息id可直接定位到消息的存储位置,避免id到位置的额外映射;
③每个part在内存中对应一个index,记录每个segment中的第一条消息偏;④发布者发到某个topic的消息会被均匀的分布到多个partition上(或根据用户指定的路由规则进行分布),broker收到发布消息往对应partition的最后一个segment上添加该消息,当某个segment上的消息条数达到配置值或消息发布时间超过阈值时,segment上的消息会被flush到磁盘,只有flush到磁盘上的消息订阅者才能订阅到,segment达到一定的大小后将不会再往该segment写数据,broker会创建新的segment。 - kafka如何实现高吞吐量、低延迟
答:
①按顺序写入磁盘减少寻道时间。②采用页面缓存,之间访问内存,减少进入磁盘访问;③消息零拷贝。