【短链服务】

短域名方案及实现

需求

撰写两个 API 接口:
- 短域名存储接口:接受长域名信息,返回短域名信息
- 短域名读取接口:接受短域名信息,返回长域名信息。

限制:
- 短域名长度最大为 8 个字符
- 采用SpringBoot,集成Swagger API文档;
- JUnit编写单元测试, 使用Jacoco生成测试报告(测试报告提交截图);
- 映射数据存储在JVM内存即可,防止内存溢出;

架构图

解释:

1、为了提高短域名的服务,采用分布式的架构

2、每台服务从注册中心获取自己唯一的ID,最前面可用Nginx等负载均衡器进行分流,网关层进行认证限流等。

3、短链服务短链生成采用雪花漂移算法,比传统雪花算法更短,虽然是long型id,做62进制转化长度可能为9个字符,但是合理进行参数配置可达到要求:机器码限制3位,也就是最多7个实例;基础时间设置为当前时间;序列设置为4位。此时对生成的id进行62进制转化限制在8个字符,可至少用十年以上,大概13年左右。

4、本服务目前使用guava本地缓存暂存映射。

单元测试覆盖率

 功能测试

性能测试

测试工具jmeter
机器配置比较旧(办公电脑,开了其他软件,如idea):

处理器:2.65GHz 四核Intel Core i5
内存:16 GB 2667 MHz DDR4

JVM配置(保守配置,用2G堆内存,1.6G年轻代):

   - 版本:JDK1.8.0_151
   - JVM设置:-Xms2048M -Xmx2048M -Xmn1640M -Xss1M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

 写性能QPS 单机600,配置7台实例能达到4000.

展望

1、映射数据没有持久化,未来持久化需进行分库分表来支持高并发。

2、接口可以使用redis对长链对幂等限制;针对高并发利用redis布隆过滤器校验生成短链不存在则将映射插入mysql, 避免多次查库判断等,缓解数据库压力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值