1. 短地址服务

短地址服务

https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR

1 需求边界

设计一个web服务
访问 http://服务url/短链接 跳转到 原始url

短链接比原始更短且唯一
可自定义
有过期时间
延迟小

2 api设计

  • 创建
    url = createURL(开发者key,原始url,自定义url,过期时间)
  • 删除
    deleteURL(开发者key,url)

3 容量估算

条件:

  1. 读写比例 100:1
  2. 每月写入请求5亿 = 500M
  3. 每个对象500字节
  4. 存储5年
  5. 28原则:20% 的热门 URL

估算:

  • 流量:
    写请求/s = 5 亿 /(30 天 * 24 小时 * 3600 秒)= ~200 URLs/s
    QPS = 100 * 200 URL/s = 20K/s

  • 带宽
    重定向带宽 = 200 * 500 字节 = 100K/s
    请求带宽 = 20K * 500 字节 = ~10 MB/s

  • 存储:
    存储对象数量 = 5亿 * 5年 * 12月 = 300亿
    总容量 = 300 亿 * 500 字节 = 15 TB

  • 内存
    每天请求 = 20K * 3600 秒 * 24 小时 ~17 亿
    每天缓存热门url = 20% * 17 亿 * 500 字节 = ~170GB

总结:
内存:17 亿条,170G
存储:300亿条,15T
传入流量:10M/S
传出流量:100K/s
创建对象:200/s
请求对象:20k/s

4 数据库设计

  • user表
    userID
    name
    email
    创建时间
    登录时间

  • url映射表
    短url
    源url
    创建时间
    过期时间
    userID

6 详细设计:短链接生成方案

如果使用 6个字符,base64 编码【AZ, az, 0-9,+,/】
64^6 ~= 687亿 > 300亿 满足要求

实时生成

  1. hash MD5(原始url)= 128 b
  2. base64( 128 b ) = 22位字符 //6b一个字符
  3. 取前6位
  4. if 重复,url添加序列 重新编码,
    序列 = 递增id或者用户id
  • 问题:
    1. 原始url 与 另一个原始url的Unicode编码 重复,生成hash重复
    2. 取前6位 可能重复。

离线生成服务 Key Generation Service

KGS 提前生成6位key存储在db
占用存储 = 6 B * 687亿 = 412 GB

获取一个key与原始url关联

  • KGS并发问题

    1. 标记已使用未使用的秘钥;
      使用两张表来存储密钥:一张用于存储尚未使用的密钥,一张用于存储所有已使用的密钥
    2. 提前存储一批秘钥在KGS服务内存
    3. 提前存储一批秘钥在短地址服务内存
      (短地址服务挂掉会丢失部分key)
  • KGS单点故障
    主备KGS服务

  • 自定义短地址限制

7 瓶颈

数据分区

  1. 根据短地址首字母分区
    不频繁出现的字母放在一个分区
    问题:数据库不均衡
  2. hash分区
    一致性哈希

缓存

redis,Memcached

  • 驱逐策略:最近最少使用 (LRU)

负载均衡

1. 客户端和应用服务器之间
2. 应用服务器和数据库服务器之间
3. 应用服务器和缓存服务器之间

过期数据清除

不断地搜索过期链接来删除它们,这会给我们的数据库带来很大的压力
惰性清理。服务会确保只删除过期的链接,虽然有些过期的链接可以存活更长的时间但永远不会退还给用户。

访问过期数据清理 + 用户流量较低时轻量级清理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值