QQ是腾讯的基石级产品,至今仍承载巨大的消息量。这道题考察候选人设计存储系统的能力,需要在写入吞吐、读取性能和跨设备一致性之间取得平衡。
定义数据模型:以会话ID和序列号为索引,包含时间戳、发送者、类型和内容等元数据。
描述冷热分层存储策略:近期消息放在Redis集群中,历史消息放在分布式KV存储,更早的消息归档到对象存储。
解释基于拉取模型的多端同步:每个设备跟踪每个会话最后同步的sequence ID。
讨论搜索实现:基于倒排索引的关键词搜索,异步构建索引避免写入延迟。
我会设计一个分层存储系统。数据模型以(conversation_id, sequence_id)为主键,存储发送者、时间戳、内容类型和消息体。热数据(最近7天)存放在按会话ID分片的Redis集群中,提供亚毫秒级读取。温数据(7天到6个月)迁移到基于LSM的分布式KV存储如RocksDB集群,优化用户浏览历史记录时的顺序读取。超过6个月的冷数据归档到对象存储,配合稀疏索引按需检索。多端同步方面,每个设备维护每个会话的游标(最后已读sequence ID),设备上线时拉取游标之后的所有消息,服务端分批流式返回。消息搜索采用异步倒排索引流水线:新消息通过Kafka消费者写入Elasticsearch集群,支持关键词和发送者维度的查询,并以会话为范围过滤。
强调分层存储策略——面试官希望看到你兼顾成本优化,而不仅是追求性能。
明确提出冷数据存储成本与检索延迟之间的权衡。
讨论媒体消息(图片、文件)与文本消息在存储架构上的分离处理。
删除操作记录为带有独立sequence ID的墓碑标记。设备同步时接收到墓碑标记后在本地删除对应消息。墓碑标记保留一定时间(如30天)以确保所有设备都能处理。
搜索管线包含延迟监控。如果索引延迟超过阈值,系统临时增加消费者并行度。对于最新消息,向用户提示可能尚未可搜索。包含URL等关键消息会优先索引。