短链系统设计

一、背景分析

短链长啥样?这里有个样例:【哈啰顺风车】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端用户拉黑

相关推荐
Ulyanov6 天前
高保真单脉冲雷达导引头回波生成:Python建模与实践
开发语言·python·仿真·系统设计·单脉冲雷达
资深web全栈开发1 个月前
高并发的本质:超越语言的协作哲学——以 Go HTTP 服务器为例
服务器·http·golang·系统设计·goroutine·高并发架构·go并发
utmhikari1 个月前
【极客日常】快速上手复杂后端项目开发的经验
ai·llm·知识库·系统设计·后端开发·rag
丘陵哈哈1 个月前
RBAC模型 VS 无角色模型
系统设计
utmhikari2 个月前
【架构艺术】简述LLM增强产品研发角色
ai·架构·llm·agent·产品经理·系统设计
記億揺晃着的那天3 个月前
数据库中 ACID 四个核心特性
数据库·mysql·oracle·系统设计·acid
utmhikari4 个月前
【架构艺术】自动化测试平台架构设计的一些通用要点
自动化测试·功能测试·测试开发·架构·测试·系统设计·后端开发
真智AI5 个月前
[特殊字符] AI时代依然不可或缺:精通后端开发的10个GitHub宝藏仓库
人工智能·github·系统设计·后端开发·github资源·编码实践
卷心菜不卷Iris7 个月前
第4章唯一ID生成器——4.1 分布式唯一ID
java·分布式·系统设计·场景题·分布式唯一id