短链系统设计

一、背景分析

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

相关推荐
万亿少女的梦1684 天前
基于Spring Boot、Java与MySQL的同城宠物服务系统设计与实现
java·spring boot·mysql·系统设计·协同过滤
书香门第6 天前
系统设计练习 - 分布式黑名单服务(design a distributed denylist service)
分布式·系统架构·系统设计
doiito10 天前
【Agent Harness】Gliding Horse 最新升级:把“智能闭环”真正跑通的一次深度优化
rust·架构设计·系统设计·ai agent
doiito14 天前
【Agent Harness】流马(Gliding Horse)DeepSeek Responses API 接入介绍
rust·系统设计·ai agent
万亿少女的梦16814 天前
基于微信小程序、Express与MongoDB的校园失物招领系统设计
mongodb·微信小程序·node.js·express·系统设计
doiito19 天前
【AI 推理】在 Rockchip NPU 上实现 MoE 大模型流式推理的技术方案
ai·系统设计
doiito24 天前
【开源项目】开源智能排产系统深度研究报告(第一部分)
架构设计·系统设计
万亿少女的梦16824 天前
基于Spring Boot的游戏交易管理系统设计与实现
java·spring boot·mysql·系统设计·交易管理
万亿少女的梦16824 天前
基于PHP的碳排放减排管理系统设计与实现
mysql·数据分析·php·系统设计·碳排放
doiito25 天前
【AI 应用】从“外国人味”到地道中文:kokoroi-rs v0.1.2 架构升级深度解析
ai·rust·系统设计