文章目录
需求边界
-
功能要求:
- 用户应该能够上传或“粘贴”他们的数据,并获得一个唯一的URL来访问它。支持有限制的自定义url
- 用户只能上传文本。不超过10MB
- 数据和链接将在特定时间间隔后自动过期;用户还应该能够指定过期时间。最长10年
- 用户可以选择为粘贴选择自定义别名。
-
非功能性要求:
- 系统应高度可靠,上传的任何数据都不应丢失。
- 该系统应具有高可用性。这是必需的,因为如果我们的服务关闭,用户将无法访问其粘贴。
- 用户应该能够以最小的延迟实时访问他们的粘贴。
- 粘贴链接不应该是可猜测的(不可预测的)。
接口定义
- 创建
key = addPaste(账号,data,自定义url,过期时间) - 查询
getPaste(账号,key) - 删除
deletePaste(账号,key)
规模估计
流量
每天100万写 = 1M,500万读 = 5M
写/s = 1M / (24 * 3600) ~= 12条
读/s = 5M / (24 * 3600) ~= 58条
带宽
写带宽/s = 12 * 10K = 120K
读带宽/s = 58 * 10k = 0.6M
存储
10年=1M * 365 * 10~=3.6G 条
每人不超过10M,
每次约10K
粘贴内容
每天 = 10K * 1M ~= 10G
10年 = 10K * 3.6G ~= 36T
urlKey
索引用6位base64足够 : 64^6 ~= 68G > 3.6G
占用存储 = 3.6G * 6 ~= 22G
保留空闲空间,采用70%容量模型,存储需求=50TB
内存
28原则,每天热点请求存入缓存
= 5M * 0.2 * 10K = 10G
总计
内存 = 10G
存储 = 50TB
写带宽/s = 120K
读带宽/s = 0.6M
写/s = 12条
读/s = 58条
数据模型
-
用户表
userID
… -
粘贴信息表
urlKey
dataUrl
创建时间
过期时间
userID