MST

星途 面试题库

面试题:消息队列 Kafka在视频直播弹幕实时处理系统中的消息持久化机制

在基于Kafka开发的视频直播弹幕实时处理系统中,Kafka是如何实现消息持久化的?有哪些关键参数可以控制消息的持久化策略?
39.5万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

Kafka实现消息持久化的方式

  1. 日志文件存储:Kafka将消息以日志文件的形式存储在磁盘上。每个Topic被划分为多个Partition,每个Partition又由多个Segment组成,每个Segment包含一定数量的消息。当Segment达到一定大小或一定时间时,会滚动生成新的Segment。
  2. 顺序写入:Kafka采用顺序写入磁盘的方式,这大大提高了写入性能。相比随机写入,顺序写入避免了磁盘寻道时间,使得写入速度接近磁盘的线性写速度。
  3. 副本机制:Kafka通过副本机制来保证数据的可靠性。每个Partition可以有多个副本,其中一个副本被指定为Leader,其他为Follower。生产者发送消息到Leader副本,Follower副本会从Leader副本同步数据。当Leader副本所在的Broker发生故障时,会从Follower副本中选举出新的Leader,确保数据不丢失。

控制消息持久化策略的关键参数

  1. log.retention.hours:指定消息在日志文件中保存的时长,默认值为168小时(7天)。超过这个时间,旧的日志文件会被删除。
  2. log.retention.minutes:与log.retention.hours类似,不过是以分钟为单位设置消息保存时长。如果同时设置了log.retention.hourslog.retention.minutes,以较小的值为准。
  3. log.retention.ms:同样是设置消息保存时长,以毫秒为单位。它的优先级高于log.retention.hourslog.retention.minutes
  4. log.segment.bytes:指定每个日志Segment文件的大小,默认值为1GB。当Segment文件达到这个大小,会滚动生成新的Segment。
  5. log.flush.interval.messages:指定在消息累计达到多少条时,将消息刷新到磁盘。默认值为Long.MAX_VALUE,即不按消息数量刷新,只按时间或文件大小刷新。
  6. log.flush.interval.ms:指定消息刷新到磁盘的时间间隔,默认值为null。如果设置了该值,Kafka会按照这个时间间隔将消息刷新到磁盘。
  7. replication.factor:指定每个Partition的副本数量。增加副本数量可以提高数据的可靠性和容错性,但也会增加存储和网络开销。
  8. min.insync.replicas:指定ISR(In-Sync Replicas)集合中最小的副本数量。生产者发送消息时,只有当ISR中的副本数量大于等于min.insync.replicas时,才认为消息发送成功。如果ISR中的副本数量小于该值,生产者会收到错误,从而保证数据不会丢失。