一、背景分析
短链长啥样?这里有个样例:【哈啰顺风车】20元乘客券已送达!a.c3x.me/bBi8S* 拒收请回复R
在需要链接的场景,过长的链接不美观,并且短信、PUSH、社交平台对内容长度有限制,使用短链接能解决这些问题。
除此之外,通过短链接服务,可以实现数据监控和统计,比如基于账户、业务方、IP等维度生成生成量/点击量的统计。
二、需求分析
1.名词解释
|----|---------------------------------|
| 名词 | 解释 |
| C端 | 消费者、个人用户或终端用户。本文指获取并点击短链的用户 |
| B端 | 通常为企业或商家。本文指创建短链的客户 |
2.功能分析
-
支持由原始链生成短链
-
支持由短链查询原始链
-
支持短链存在有限期
-
支持用户点击统计
三、系统设计
1.存储模型设计
只设计最基础的字段,其它信息例如用户点击时短链是否过期,t_url_user表是否冗余过期时间在此不设计。

-
C端用户点击短链后将访问记录存储至t_url_click(点击访问表)
-
B端用户创建短链后,将创建者信息存储至t_url_user(短链创建用户表),短链与原始链关联关系存储至t_url_mapping表
2.关键功能设计
2.1 C端用户点击短链流程
用户点击短链后,会被浏览器重定向到原始链接

短链服务返回的status code为302。如果使用301重定向,浏览器会放到缓存,下次点击短链时浏览器会直接访问原始链,对点击次数统计有影响。

2.2 B端用户生成短链流程

生成短链的策略
|-------------------|----------------|----------------------------|
| 方案 | 优点 | 缺点 |
| 原链通过Base62转换 | 简单,无法根据短链猜测业务量 | 生成的链接过长 |
| 原链HASH后Base62转换 | 简单,无法根据短链猜测业务量 | 可能有HASH冲突 |
| 由自增ID转Base62后关联原链 | 性能高,跟原链无直接关联 | 短链递增,可能猜测到流水量,依赖分布式ID服务的性能 |
本文档采用由自增ID转Base62后关联原链的方案。分布式ID的方案也有很多,也支持预生成,不会成为创建短链的瓶颈。
2.3 BC端短链查询优化与缓存设计
短链系统总体上看是读多写少 。如短信营销场景是写多读少 ,微博分享短链时是读多写少。
创建短链时可以设置缓存进行预热,避免大量请求到达数据库。
查询短链时可以使用查询后更新缓存,并使用分布式锁让查询请求只有一次访问到数据库。

3.接口定义
|-----------|------------------------|----------|----------------------|----------------|----------|
| 功能说明 | 关键入参 | 响应结果 | 幂等说明 | SLA 说明 | 场景 |
| 创建短链 | 原始链接、登录信息、短链有效期、是否开启幂等 | 短链 | 开启幂等后,1s内重复请求会返回相同短链 | 支持1wQPS | B端创建短链 |
| 根据短链查询原始链 | 短链 | 原始链 | 无 | 无 | 管理员运维/审核 |
4.风险评估
4.1 存储数据量过大
定期清理:
DB中过期数据可以每天定时清理(主动)或访问发现失效时惰性删除(被动)
分库分表:
可以将短链按hash值分表,按单表8KW,64张表,最多可容纳51.2亿数据。
4.2 缓存热点问题
C端点击短链时,短链需要查询长链,为了提高查询速度,一般会引入缓存。引入缓存就会存在缓存穿透/击穿/雪崩的问题,结合本次需求列出处理方式
|------|-----------|-----------------------------------------------------------------------------------|------------------------|
| | 缓存穿透 | 缓存击穿 | 缓存雪崩 |
| 描述 | 查询的短链不存在 | 某小段时间大量相同短链查询达到存储层 | 缓存无法提供服务,大量请求打到存储层 |
| 解决方法 | 使用布隆过滤器拦截 | * 热点短链访问后延长过期时间。 * 互斥加锁,多线程访问redis某key无数据时,只有一个线程能去存储层查询并存入redis,然后其它线程再从redis取数据 | * 设置过期时间为随机值 * 构建高可用服务 |
为减少内存消耗和避免缓存雪崩,Redis过期时间应设置在实际过期时间的20%~50%。
4.3 一致性
t_url_mapping(短链映射表)和t_url_user(短链创建表)有关联关系。如果需要强一致,则要加上事务,但实际上用户访问短链不需要短链创建表信息,可以采用异步方式提高性能和保证最终一致。
4.4 高可用
短链服务是高并发业务,同时也需要保证高可用。
Mysql、Redis、Nginx、微服务的高可用方案也都比较成熟,这里不赘述,可以根据关键词搜索(哨兵模式、keepalive、半同步)
四、其它
1.监控告警
监控
-
统计单短链访问量、B端用户管理短链集合访问量、C端用户访问量
-
B端用户生成短链量
告警
-
C端访问短链频率飙升或严重下降
-
B端用户创建短链频率飙升或严重下降
2.运维保障
支持C端、B端用户拉黑