shorturl-go

module
v0.0.0-...-61a4d47 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 24, 2019 License: MIT

README

短链接服务

使用 Go 语言实现一个短链接服务。目的是能综合应用一些框架和中间件来实现需求。

实现原理

生成

  1. 对于所有输入的短链接,都利用发号器生一个唯一的 ID 与之匹配
  2. 将上一步生成的 ID 转换成 62 进制,得到一个 short code,拼接域名,并返回给用户端

查询

  1. 用户使用 short code 访问短链服务
  2. 系统查找到对应的原始链接,并采用 HTTP 301 重定向请求,减少对服务端的压力

优化

  1. 查询时可添加一层缓存层,提高应付更高请求量的能力
  2. 理论上,在请求量和数据量不大的情况下,一个数据库发号即可。否则,可以考虑使用独立的发号器服务(该服务可以采用逻辑节点分发请求,以应付较高的请求压力)

说明

  1. 考虑最多 6 位 62 进制数,可以表示多达 562 亿种短链接,足够一般应用了
  2. 发号器使用 Redis,但是为了避免单点的问题,我们会将发号区间分成 1000 个逻辑发号器。每个发号器的起始 code 不同,但是步进均为 1000。也就是我们会准备 1000 个 key 用于发号。可以采用轮询或者随机或者带权重等机制进行发号。初期可以考虑将逻辑 key 分布在一个节点上,方便测试。但如果要应付更高的并发量以及提高可用性,可以考虑将 key 分散在集群中的多个节点上。
  3. 存储压力?可以考虑分表分库解决。不过如果使用了 TiDB 这种 NewSQL 存储方案的话,这一点就暂时不考虑了。

参考

Directories

Path Synopsis
cmd
web
pkg
controller
发号器使用 Redis 实现,预先分配了 N 个 key, 它们会被分布到 M 个节点上(后期可以考虑 twemproxy 与 Redis 集群通信)
发号器使用 Redis 实现,预先分配了 N 个 key, 它们会被分布到 M 个节点上(后期可以考虑 twemproxy 与 Redis 集群通信)
web

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL