Kafka的用途有哪些?使用场景如何?
kafka常用于以下场景:异步处理、日常系统解耦、削峰、提速、广播。
具体的业务场景有:消息、网站活动追踪、监测指标、日志聚合、流处理、事件采集、提交日志等。
Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么
ISR:In-Sync Replicas,副本同步队列
AR:Assigned Replicas,所有副本
ISR是由leader维护,follower从leader同步数据有一些延迟(包括延迟时间replica.lag.time.max.ms和延迟条数replica.lag.max.messages两个维度, 当前最新的版本0.10.x中只支持replica.lag.time.max.ms这个维度),任意一个超过阈值都会把follower剔除出ISR, 存入OSR(Outof-Sync Replicas)列表,新加入的follower也会先存放在OSR中。AR=ISR+OSR。
Kafka中的HW、LEO、LSO、LW等分别代表什么?
HW:High Watermark 高水位,取一个partition对应的ISR中最小的LEO作为HW,consumer最多只能消费到HW所在的位置上一条信息。
LEO:LogEndOffset 当前日志文件中下一条待写信息的offset
HW/LEO这两个都是指最后一条的下一条的位置而不是指最后一条的位置。
LSO:Last Stable Offset 对未完成的事务而言,LSO 的值等于事务中第一条消息的位置(firstUnstableOffset),对已完成的事务而言,它的值同 HW 相同
LW:Low Watermark 低水位, 代表 AR 集合中最小的 logStartOffset 值
Kafka中是怎么体现消息顺序性的?
kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。
整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1.
Kafka中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序是什么?
拦截器->序列化器->分区器
Kafka生产者客户端中使用了几个线程来处理?分别是什么?
2个,主线程和Sender线程。主线程负责创建消息,然后通过分区器、序列化器、拦截器作用之后缓存到累加器RecordAccumulator中。Sender线程负责将RecordAccumulator中消息发送到kafka中
消费者提交消费位移时提交的是当前消费到的最新消息的offset还是offset+1?
offset+1
有哪些情形会造成重复消费?
消费者消费后没有commit offset(程序崩溃/强行kill/消费耗时/自动提交偏移情况下unscrible)
哪些情景下会造成消息漏消费?
消费者没有处理完消息 提交offset(自动提交偏移 未处理情况下程序异常结束)
KafkaConsumer是非线程安全的,那么怎么样实现多线程消费?
1.在每个线程中新建一个KafkaConsumer
2.单线程创建KafkaConsumer,多个处理线程处理消息(难点在于是否要考虑消息顺序性,offset的提交方式)
Kafka为什么使用磁盘作为存储介质
有以下5点原因
1.顺序读写优化
顺序写入速度快:磁盘的顺序读写性能远高于随机读写。Kafka设计时采用了append的方式来写入消息,只能在日志文件的尾部追加新的消息,并且不允许修改已写入的消息,这种方式属于典型的顺序写磁盘操作,能够充分发挥磁盘顺序写入的性能优势。
操作系统优化:操作系统可以对顺序写入进行深层次的优化,如预读(read-ahead)、后写(write-behind)技术,进一步提升读写效率。
2.页缓存和mmap
页缓存:kakfa大量使用了操作系统的页缓存机制。页缓存将磁盘中的数据缓存到内存中,减少对磁盘I/O的操作。当进程需要读取磁盘上的文件时,如果数据已在页缓存中,则直接返回数据,避免了磁盘I/O
mmap(内存映射文件):Kafka通过mmap技术将磁盘文件映射到内存中,用户可以通过修改内存来修改磁盘文件,提高了数据的读写效率。
3.避免JVM内存和系统内存之间的复制。
减少性能开销:直接使用磁盘进行存储,避免了数据在JVM内存和系统内存之间的复制,减少了性能的创建对象和垃圾回收的开销。
4.高效的数据管理和查询
数据文件分段:Kafka将topic中的一个partition大文件分成多个小文件段(segment),通过多个小文件段,容易定期清除或删除已经消费完的文件,减少磁盘占用。
索引机制:为了提高查询效率,Kafka为每个分段后的数据文件建立了索引文件。索引文件中包含索引条目,每个条目表示数据文件中一条消息的索引,包括相对offset和partition,通过索引可以快速定位消息。
5.可靠性和持久性
数据持久化:Kafka将消息持久化到磁盘,即使Kafka服务重启,页缓存还是会保持有效,而进程内的缓存却需要重建。这极大地简化了代码逻辑,并提高了数据的可靠性和持久性。
多副本机制:Kafka通过数据的复制机制,确保了在某些节点出现故障的情况下,系统依然能够正常工作,不会丢失数据。