面试题答案
一键面试持久化策略
- Kafka:采用基于分区的日志追加策略。消息以追加的方式写入分区日志文件,每个分区是一个有序的、不可变的消息序列。默认情况下,Kafka会将消息保留一定时间(可配置),过期后自动删除。可以通过设置
retention.ms
参数来指定消息保留的时长,也可通过retention.bytes
来限制分区日志文件的大小。 - RabbitMQ:提供了两种持久化策略,针对队列和消息。队列持久化意味着队列会在RabbitMQ服务器重启后依然存在,通过将队列声明为持久化(
durable
属性设置为true
)来实现。消息持久化是指消息被写入磁盘,以防止服务器崩溃时丢失,通过将消息的deliveryMode
属性设置为2来标记为持久化消息。
存储方式
- Kafka:数据存储在磁盘上的日志文件中,以分区为单位组织。每个分区由多个日志段(log segment)组成,每个日志段包含一定数量的消息。日志段文件的命名基于起始偏移量,方便快速定位消息。Kafka使用顺序I/O来写入和读取日志文件,这种方式在高吞吐量场景下性能较好。
- RabbitMQ:消息持久化时,会存储在磁盘上的持久化存储文件中。RabbitMQ使用的存储格式因版本和配置而异,例如在较新版本中使用
Raft
算法来管理数据复制和一致性。消息存储结构相对复杂,因为需要支持多种队列类型和功能,如优先级队列等。
对系统性能的影响
- Kafka:由于采用顺序I/O和日志追加方式,写入性能高,适合处理高吞吐量的消息流。但在消息查询方面,由于其设计初衷并非为了随机访问,所以如果需要频繁查询特定消息,性能可能较差。
- RabbitMQ:持久化操作相对复杂,尤其是对于消息和队列的持久化处理,会增加额外的开销。写入性能相对Kafka较低,特别是在高并发写入场景下。但RabbitMQ在消息查询和队列管理方面更灵活,能满足一些对消息处理有复杂需求的场景。
对系统可靠性的影响
- Kafka:通过多副本机制(
replication factor
)来保证数据可靠性。每个分区可以有多个副本,其中一个是领导者副本(leader),其他是跟随者副本(follower)。领导者副本负责处理读写请求,跟随者副本从领导者副本同步数据。如果领导者副本所在节点故障,会从跟随者副本中选举出新的领导者,保证数据不丢失。但如果所有副本所在节点同时故障,还是可能丢失数据。 - RabbitMQ:通过持久化队列和消息到磁盘来保证可靠性。但如果在消息确认机制配置不当的情况下,如客户端发送持久化消息后未等待服务器确认就关闭连接,可能会导致消息丢失。此外,RabbitMQ集群在节点故障转移时,可能会因为数据同步不及时等问题,对可靠性产生一定影响。