系统设计面试:如何设计一个如微信或WhatsApp这样的消息系统

本视频是关于设计一个消息系统,如WhatsApp或WeChat,涵盖了功能要求和非功能要求,包括一对一聊天和群组聊天、媒体共享、推送通知和在线离线指示等。 视频还介绍了系统架构概述,包括网关、聊天服务、标识服务、服务发现、映射表和在用户状态上的心跳机制。 此外,讨论了其他相关话题,如端到端加密、媒体文件处理和滥用防御。

 

00:00 这部分视频讨论了一个消息系统的设计,包括功能需求和非功能需求,以及每天发送的消息数量的估计。

  • 功能需求包括一对一聊天、群聊、媒体分享、推送通知和在线/离线指示。
  • 非功能需求包括高可用性和可扩展性。
  • 每天发送的消息数量估计为50亿条。

02:54 这一部分介绍了数据库模式和架构概述。

  • 数据库模式包括用户、设备、会话和消息表。
  • 用户和设备之间是多对多关系,设备只能属于一个用户。
  • 会话可以是一对一的对话,也可以是群组对话。
  • 消息表用于存储用户发送的消息。
  • 架构概述中提到了需要一个网关来处理不同的协议。

05:50 在聊天服务中,我们需要考虑轮询和推送模型,以及有状态和无状态服务。

  • 轮询模型是客户端发送请求到服务器并保持连接,直到有新数据或超时发生。
  • 推送模型使用Websockets协议进行双向全双工通信,轻量且能独立发送消息。
  • 有状态服务处理每个请求时都不保留用户会话信息,而无状态服务则更简单。

08:44 为了实现快速写入数据,建议使用NoSQL数据库Cassandra或DynamoDB。还需要一个ID服务来生成Twitter雪花算法生成的唯一时间序列标识符,以便在设备间进行消息同步。使用Zookeeper进行服务发现,以维护可用的聊天服务器列表和状态。同时,使用映射表来记录客户端ID和服务器ID的对应关系。

  • 建议使用NoSQL数据库Cassandra或DynamoDB来实现快速写入数据。
  • 使用Twitter雪花算法生成唯一的时间序列标识符,用于设备间的消息同步。
  • 使用Zookeeper进行服务发现,维护聊天服务器列表和状态。
  • 使用映射表记录客户端ID和服务器ID的对应关系。

11:39 在消息应用程序中,需要使用映射表将消息转发给在线的用户,并使用心跳机制来维护用户的实时状态。

  • 使用映射表将消息转发给在线用户的服务器。
  • 使用心跳机制发送周期性信号以维护用户的实时状态。
  • 心跳信号包含用户ID、在线状态和最后在线时间戳。
  • 心跳信号存储在数据库中,并通过消息队列传递给其他用户。

 

请登录后发表评论

    没有回复内容