短链系统设计

一、背景分析

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

相关推荐
doiito11 天前
【Agent Harness】Gliding Horse v0.1.4.preview 发布:时间感知、闭环审计与智能增强
ai·rust·架构设计·系统设计·ai agent
doiito14 天前
Gliding Horse 时间感知系统:让 AI Agent 真正“感知“时间流逝
ai·rust·架构设计·系统设计·ai agent
万亿少女的梦16814 天前
基于Node.js和Express的旅游信息管理平台设计与开发
mysql·node.js·express·系统设计·旅游信息管理
万亿少女的梦16814 天前
基于SpringBoot与Vue的历史博物馆展品展示与游客管理系统设计
spring boot·mysql·vue·系统设计·博物馆管理系统
万亿少女的梦16815 天前
基于Spring Boot与Vue的繁星技术论坛系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦16815 天前
基于SpringBoot的考研学习交流系统设计与开发
spring boot·mysql·vue·系统设计·论坛系统
万亿少女的梦16817 天前
基于Spring Boot的天空影院电影网站系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦16817 天前
基于Spring Boot的社区管理系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦16817 天前
基于Spring Boot的楚雄旅游景区门票售卖系统设计与实现
java·spring boot·mysql·vue·系统设计