module
Version:
v0.0.0-...-61a4d47
Opens a new window with list of versions in this module.
Published: Sep 24, 2019
License: MIT
Opens a new window with license information.
README
¶
短链接服务
使用 Go 语言实现一个短链接服务。目的是能综合应用一些框架和中间件来实现需求。
实现原理
生成
- 对于所有输入的短链接,都利用发号器生一个唯一的 ID 与之匹配
- 将上一步生成的 ID 转换成 62 进制,得到一个 short code,拼接域名,并返回给用户端
查询
- 用户使用 short code 访问短链服务
- 系统查找到对应的原始链接,并采用 HTTP 301 重定向请求,减少对服务端的压力
优化
- 查询时可添加一层缓存层,提高应付更高请求量的能力
- 理论上,在请求量和数据量不大的情况下,一个数据库发号即可。否则,可以考虑使用独立的发号器服务(该服务可以采用逻辑节点分发请求,以应付较高的请求压力)
说明
- 考虑最多 6 位 62 进制数,可以表示多达 562 亿种短链接,足够一般应用了
- 发号器使用 Redis,但是为了避免单点的问题,我们会将发号区间分成 1000 个逻辑发号器。每个发号器的起始 code 不同,但是步进均为 1000。也就是我们会准备 1000 个 key 用于发号。可以采用轮询或者随机或者带权重等机制进行发号。初期可以考虑将逻辑 key 分布在一个节点上,方便测试。但如果要应付更高的并发量以及提高可用性,可以考虑将 key 分散在集群中的多个节点上。
- 存储压力?可以考虑分表分库解决。不过如果使用了 TiDB 这种 NewSQL 存储方案的话,这一点就暂时不考虑了。
参考
Click to show internal directories.
Click to hide internal directories.