面试题答案
一键面试消息存储
- RocketMQ:
- 采用基于CommitLog的存储机制,所有消息都顺序写入CommitLog文件,然后通过ConsumeQueue作为消息的索引,提高消息写入和读取效率。这种结构有利于提高写入性能,并且在消息堆积情况下,性能相对稳定。
- 支持多种消息存储配置,如可以根据业务需求调整CommitLog文件大小等参数,满足不同业务场景对存储的要求。
- Kafka:
- 消息以分区为单位存储在不同的日志段文件(LogSegment)中,每个分区中的消息是顺序追加写入,Kafka的这种存储设计在高吞吐量场景下表现出色,但在消息堆积较多时,可能因文件不断增大而对性能产生一定影响。
- Kafka的存储设计侧重于高吞吐和低延迟,对于单个消息的存储和管理相对RocketMQ没有那么精细。
复制
- RocketMQ:
- 支持同步双写和异步复制两种模式。同步双写模式下,主节点将消息写入本地后,需等待至少一个从节点同步完成才返回成功响应,确保了消息在主从节点间的强一致性,大大提高了消息可靠性,但这种模式会稍微影响写入性能。异步复制模式则是主节点写入成功后就立即返回,从节点异步复制消息,写入性能较高,但存在主节点故障时少量消息丢失的风险。
- RocketMQ的复制机制可以根据业务场景灵活选择同步或异步模式,在保证消息可靠性的同时兼顾性能需求。
- Kafka:
- 采用异步复制机制,Leader 副本将消息写入本地后,立即向生产者确认成功,Follower 副本异步从 Leader 副本拉取消息进行同步。这种方式虽然保证了高吞吐量,但在 Leader 副本故障且部分 Follower 副本未及时同步消息的情况下,可能会丢失少量消息。
- Kafka 主要通过 ISR(In - Sync Replicas)机制来保障消息可靠性,只有在 ISR 中的副本才被认为是与 Leader 保持同步的,当 Leader 故障时,会从 ISR 中选举新的 Leader,但这种机制相对RocketMQ同步双写模式,在强一致性保障上稍弱。
刷盘策略
- RocketMQ:
- 支持同步刷盘和异步刷盘两种策略。同步刷盘时,消息写入内存的PageCache后,会立即将PageCache中的数据刷写到磁盘,确保消息不会因系统故障丢失,可靠性极高,但会影响写入性能。异步刷盘则是消息写入PageCache后,由后台线程按照一定的时间间隔或数据量阈值将PageCache中的数据刷写到磁盘,这种方式写入性能较高,但在系统故障时可能会丢失少量未及时刷盘的消息。
- RocketMQ可以根据业务对可靠性和性能的要求,灵活选择刷盘策略,同时还可以通过调整刷盘相关参数(如刷盘间隔时间等)来平衡可靠性和性能。
- Kafka:
- Kafka的刷盘策略由操作系统控制,数据先写入PageCache,然后由操作系统根据自身的调度策略将PageCache中的数据刷写到磁盘,开发者无法直接控制刷盘时机和策略。这种方式在一定程度上简化了操作,但对于对消息可靠性要求极高且对刷盘有精确控制需求的业务场景来说,灵活性不足。