技术面试题

QQ海量消息存储与检索系统设计

"QQ月活超5亿用户,产生海量聊天记录,如何设计消息存储与检索系统以支持快速搜索和多端同步?"

为什么面试官会问这道题

QQ是腾讯的基石级产品,至今仍承载巨大的消息量。这道题考察候选人设计存储系统的能力,需要在写入吞吐、读取性能和跨设备一致性之间取得平衡。

如何回答

  1. 1

    定义数据模型:以会话ID和序列号为索引,包含时间戳、发送者、类型和内容等元数据。

  2. 2

    描述冷热分层存储策略:近期消息放在Redis集群中,历史消息放在分布式KV存储,更早的消息归档到对象存储。

  3. 3

    解释基于拉取模型的多端同步:每个设备跟踪每个会话最后同步的sequence ID。

  4. 4

    讨论搜索实现:基于倒排索引的关键词搜索,异步构建索引避免写入延迟。

参考回答示例

我会设计一个分层存储系统。数据模型以(conversation_id, sequence_id)为主键,存储发送者、时间戳、内容类型和消息体。热数据(最近7天)存放在按会话ID分片的Redis集群中,提供亚毫秒级读取。温数据(7天到6个月)迁移到基于LSM的分布式KV存储如RocksDB集群,优化用户浏览历史记录时的顺序读取。超过6个月的冷数据归档到对象存储,配合稀疏索引按需检索。多端同步方面,每个设备维护每个会话的游标(最后已读sequence ID),设备上线时拉取游标之后的所有消息,服务端分批流式返回。消息搜索采用异步倒排索引流水线:新消息通过Kafka消费者写入Elasticsearch集群,支持关键词和发送者维度的查询,并以会话为范围过滤。

实用技巧

  • 强调分层存储策略——面试官希望看到你兼顾成本优化,而不仅是追求性能。

  • 明确提出冷数据存储成本与检索延迟之间的权衡。

  • 讨论媒体消息(图片、文件)与文本消息在存储架构上的分离处理。

常见问题

如何处理多设备间的消息删除?

删除操作记录为带有独立sequence ID的墓碑标记。设备同步时接收到墓碑标记后在本地删除对应消息。墓碑标记保留一定时间(如30天)以确保所有设备都能处理。

搜索索引落后于消息存储怎么办?

搜索管线包含延迟监控。如果索引延迟超过阈值,系统临时增加消费者并行度。对于最新消息,向用户提示可能尚未可搜索。包含URL等关键消息会优先索引。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠