系统设计面试问题:设计​WhatsApp

 我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情

在这个系统设计面试场景中,我们被要求设计一个类似于 WhatsApp 的消息应用程序。

虽然真正的面试可能会关注应用程序的一个或多个功能,但在本文中,我们将对系统架构进行概述,然后您可以根据需要更深入地探索特定领域。

目录

明确功能需求

澄清非功能性需求

估算:数据数学

高级 API 设计

高层系统设计

结论和当前系统瓶颈


明确功能需求

  让我们通过向面试官提出一些问题来缩小范围,因为在一小时内设计整个 WhatsApp 平台是不现实的:

  • 主要用例: 该应用程序的主要目的是发送、检查和接收消息,以及阅读和将消息标记为已读。
  • 群组:我们不涵盖群组消息,仅涵盖一对一消息。
  • 内容类型:我们仅支持文本消息,不支持图像或视频。

澄清非功能性需求

  规模:首先,我们来谈谈规模,即系统有多大,可以处理多少条消息。假设每天发送的消息量为  100 亿条,我们的目标是在一年内将这一数字翻一番。

可用性:在可用性方面,我们希望系统高度可用且始终可运行。

延迟:至于系统延迟,我们希望它几乎立即发生,因此大多数 API 请求应在 100 毫秒内完成。

估算:数据数学

  每天有 100 亿条消息,我们大约有 100 亿条消息 / 每天 86,400 秒 =每秒 115,740 条消息 (MPS)。一年内翻倍意味着我们应该计划 115,740 * 2 = 231,480 MPS

假设每条消息 200 字节,则每日存储量为 100 亿条消息 * 200 字节 = 2 兆兆字节 (TB)。每年存储量(含增长)约为 2 TB * 365 天 * 2 = 1.5 PB。

值得注意的是,我们计算的是平均值,但系统需要处理峰值流量,这可能远高于平均 MPS。我们可能需要根据高峰时段进行扩展。

高级 API 设计

  我们可能会使用 RESTful API 样式来实现更广泛的兼容性。以下是可能的端点的细分:

  1. 发送消息(POST /messages):请求正文包含收件人 ID 和消息内容。成功响应 (200) 返回唯一消息标识符。错误代码 (400、500) 处理缺少参数或服务器问题。
  2. 检查新消息(GET /messages):响应为 200(带有未读消息数组)或 204(如果没有未读消息)。
  3. 获取特定消息(GET /messages/:messageId):返回特定消息(200)或 404(如果未找到)。
  4. 将消息标记为已读(PUT 或 PATCH /messages/:messageId):成功响应(200)确认更改,而 404 表示未找到消息。

其他注意事项:我们将集成 WebSockets 以实现实时更新。API 将处理身份验证和初始连接建立。并且可能需要对“检查新消息”端点进行分页。输入验证等安全措施也是必要的。

高层系统设计

  移动应用程序:用户的主要界面将是移动应用程序(iOS、Android)。此应用程序负责发送和接收消息、联系人管理和对话。

负载均衡器:为了高效处理传入请求,我们将使用负载均衡器在多台服务器之间分配流量。这提高了应用程序的可靠性。

API 服务器:所有请求都将发送到 API 服务器,该服务器 处理我们之前概述的 RESTful API,管理消息传递逻辑。API 服务器本身可以是无状态的;这样,我们可以随着流量的增长而水平扩展(添加更多服务器)。

WebSocket 连接:类似 WhatsApp 的应用程序严重依赖 WebSocket 进行实时通信。聊天服务器将与移动应用程序保持持久的 WebSocket 连接。当消息到达时,可以立即将其推送到收件人的设备。

消息分发器:接下来,我们将有一个消息分发器服务,该服务的主要目的是将 API 服务器与直接数据库写入分离,这对于处理高写入量尤为重要。

消息队列(例如 Kafka 或 RabbitMQ)非常适合。其工作原理如下:

  1. API 服务器收到“发送消息” POST 请求。
  2. 它将消息放在队列上并及时向客户端返回成功/确认。
  3. 单独的工作进程异步地从队列中读取消息并将消息写入数据库。

数据库(NoSQL):我们同意最终的一致性是可以接受的,这使得 NoSQL 成为高消息量的可扩展选择。

让我们考虑两个强有力的选择:

  • Cassandra:宽列存储,以可扩展性、高可用性和写入性能而闻名。如果我们预期写入量较大,且读取模式更简单(主要通过 ID 获取消息),那么这种存储就特别有用。
  • DynamoDB: AWS 提供的完全托管的键值和文档数据库。如果我们想要一个维护成本低且易于扩展的数据库解决方案,那么它是非常有利的。

分片和分区:对数据进行分片(水平分区)至关重要,因为没有一个数据库可以满足我们 1.5 PB 的存储需求。

但是我们如何对这些数据进行分片和分区,以及这些 API 服务器如何知道从哪里请求这些数据?

我们可以根据进行分区userId。涉及用户的所有消息将驻留在同一个分片/分区中。我们的 API 服务器有两种潜在的方式来定位数据:

  • 一致性哈希环:可以根据分区键确定数据位置,从而允许 API 服务器将请求直接路由到正确的数据库分片。
  • 元数据服务:单独的服务保存分区键到分片位置的映射。API 服务器首先查询此服务,然后进行数据库调用。

结论和当前系统瓶颈

  这概述了类似 WhatsApp 应用程序的主要架构。现在,让我们检查一下当前系统中的潜在瓶颈以及需要改进的领域:

  • 数据库写入:高写入量是潜在的瓶颈。分片、消息队列和优化的数据库选择至关重要。
  • 端到端加密: WhatsApp 模型非常强调安全性。实施端到端加密将是一个重要的讨论。
  • 群聊:此功能给消息路由和存储带来了额外的复杂性。
  • 媒体处理:我们可以实现一个处理图像和视频上传的系统,在这里使用压缩并为缩略图提供多种存储大小。

 职场攻略与副业指南,成就你的IT人生。快扫描下面二维码关注吧!

ba1e8177db424136a3b666cf83ea7eef.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2048小游戏,h5,纯前端

部分代码 //scorevar scoreSprite game.add.sprite(10, 10);var scoreGraphics game.add.graphics(0, 0);scoreGraphics.lineStyle(5, 0xA1C5C5);scoreGraphics.beginFill(0x308C8C);scoreGraphics.drawRoundedRect(0, 0, 70, 50, 10);scoreGraphics.endFill();scoreSprite.a…

PyTorch 深度学习实践-循环神经网络(高级篇)

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记总代码练习 上课笔记 个人能力有限,重看几遍吧,第一遍基本看不懂 名字的每个字母都是一个特征x1,x2,x3…,一个名字是一个序列 rnn用GRU 用ASCII表作为词典,长度为128&#x…

业务系统核心模块资料访问性能优化实战

随着业务系统的云化转型不断推进,业务量呈现显著增长,对业务系统的性能和资源管理提出了更高要求。在这样的背景下,实现系统资源使用与性能指标的均衡成为保障生产系统高效稳定运行的核心任务。 在性能优化的范畴内,核心业务系统对…

苏州金龙海格汽车入选2024中国汽车行业可持续发展实践案例

2024年7月11日-13日,由中国汽车工业协会主办的第14届中国汽车论坛在上海嘉定举办。本届论坛隆重发布了“2024中国汽车行业可持续发展实践案例”,苏州金龙因在坚持绿色可持续发展方面做出的努力和贡献获评2024中国汽车行业可持续发展实践案例“绿色发展”…

【P2P_BMA_P2MP_NBMA】

基本概念介绍 1. BMA(Broadcast) 广播型多路访问技术,在一个MA(多路访问,在一个网段内的节点数量不限制。)网络中同时存在广播机制。 特点: 允许将数据包广播到网络上的所有主机。路由器之间…

【AI大模型Agent探索】深入探索实践 Qwen-Agent 的 Function Calling

系列篇章💥 No.文章1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用4【Q…

PyTorch 深度学习实践-卷积神经网络基础篇

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记代码实现作业实现 上课笔记 如果一个网络全都是由线性层串联起来(torch.nn.Linear(xx, yy)),就叫他全连接的网络(左边节点到右边节点任意两个都存在权重) 先看一下吴恩达或者李宏毅老师…

QT通用配置文件库(QPreferences)

QT通用配置文件库(QPreferences) QPreferences项目是基于nlohmann/json的qt可视化配置文件库,将配置保存成json格式,并提供UI查看与修改,可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体&#…

【Git标签管理】理解标签 | 创建标签 | 查看标签 | 删除标签 | 推送标签

目录 1.理解标签 2.创建标签 3.查看标签 4.删除本地仓库的标签 5.推送标签 6.删除远程仓库的标签 1.理解标签 Git提供一个打标签的功能tag,对某一次事务/提交的表示(作用/意义)。标签 tag ,可以简单的理解为是对某次 comm…

Java(二十二)---队列

文章目录 前言1.队列(Queue)的概念2.Queue的使用3.队列的模拟实现4.循环队列5.双端队列6.面试题[1. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)[2. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/de…

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用,着重拓展机监督学习和无监督学习的相关知识。 重点:机器学习的定义和应用; 难点:机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…

<数据集>钢板缺陷检测数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1986张 标注数量(xml文件个数):1986 标注数量(txt文件个数):1986 标注类别数:7 标注类别名称:[crescent gap, silk spot, water spot, weld line, oil spot, punchin…

工业圆点定位激光器主要应用场景有哪些?

在现代工业生产的各个领域,精确定位和高效操作已成为提升生产效率和产品质量的关键。其中,工业圆点定位激光器以其高精度、高效率的特性,成为了众多工业应用中的核心工具。接下来我们就跟着鑫优威一起来深入了解一下关于工业圆点定位激光器的…

抖音/快手/小红书私信卡片在线制作

W外链平台,作为现代网络营销领域的一颗璀璨明星,其强大的功能和独特的优势已经吸引了无数企业和个人的目光。在如今这个信息爆炸的时代,如何有效地将自己的网站、产品、服务推广出去,成为了每个营销人员都在思考的问题。而W外链平…

CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”

参考连接: 【linux】CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…

uniapp 微信默认地图选点功能实现

效果图 配置项 微信公众平台-小程序配置 uniapp配置 上代码 <template><view class"content"><button click"toMap">请选择位置</button></view> </template><script setup lang"ts">function toMa…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下&#xff1a; IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

Leetcode1929. 数组串联

问题描述&#xff1a; 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言…

Unity 导入MRTK,使用URP 升级材质,MRTK的材质还是洋红色

控制台显示信息 ToggleBackground material was not upgraded. There’s no upgrader to convert Mixed Reality Toolkit/Standard shader to selected pipeline UnityEditor.Rendering.Universal.UniversalRenderPipelineMaterialUpgrader:UpgradeProjectMaterials() (at 点击…

独立游戏《星尘异变》UE5 C++程序开发日志6——实现存档和基础设置系统

目录 一、存档类 1.创建一个SaveGame类 2.存储关卡内数据 3.加载关卡数据 4.关于定时器 5.存储全局数据 6.加载全局数据 二、存档栏 1.存档栏的数据结构 2.创建新存档 3.覆盖已有存档 4.删除存档 三、游戏的基础设置 1.存储游戏设置的数据结构 2.初始化设置 3.…