# shortlink **Repository Path**: lanceluot/shortlink ## Basic Information - **Project Name**: shortlink - **Description**: saas短链接系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-12 - **Last Updated**: 2025-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 技术难点 ### 1.当恶意用户而已大量请求注册接口时,如何防止 用户命唯一且不可变,当大量使用随机用户名请求时如何防止恶意调用,使用布隆过滤器存储用户名进行拦截,可能会返回错误的存在结果,此时使用加锁 ### 2.如何防止海量数据下的读扩散问题 解决方案是使用分库分表处理, 用户是海量数据的前提下,分组也是有可能是海量的数据,那么分组也要做分库分表处理, 用户分表显然是用具有唯一性的用户名作为分片键,而分组表与用户关联显然也是用用户名作为分片键 ### 3.短链接生成以及跳转原理 短链接生成原理是将原长链接进行hash处理转化为10进制再进行base62编码,据估计26个大小写字母+10个数字组成6个长度的字符串种类有568亿个, 对于存储海量短链接完全足够,短短链接的跳转原理是利用了http状态码302的重定向功能,304也是重定向,但是他们之间有区别,这里只介绍302 ### 4.如何防止高并发下创建短链接或者有人恶意请求创建短链接 由于短链接生成的原理是使用原始链接hash并编码生成,但是如果多个用户创建同一个原始链接,比如在热点链接下,要想使得生成的短链接不重复, 可以加上时间戳,但是在高并发下,创建短短链存在的问题就是会有可能在极短时间内的时间戳也是一样的,这时我们采用的是时间戳+UUID生成, 进一步降低了重复短连接生成的问题,还有一种做法就是使用全局唯一id生成器拼接生成短链接 ### 5.面对海量高并发请求跳转短链接如何应对 高并发的请求跳转链接,这是常有的事,当运行创建好一个活动链接并批量投放给所有用户,此时很可能就会并发访问, 此时如何保证高可用,高并发,响应速度块,之前我们跳转一个链接需要查缓存,查数据库,然后还要统计监控数据, 并插入数据库,完成后才跳转,显然这大大影响性能,也给数据库带来了很大压力,改进方案是用户的跳转页面要优先加载, 查缓存,查数据库后,就要对用户的请求做出响应,插入 统计检数据可以使用异步加消息队列进行延迟处理, 只要保证数据不丢失即可,消息队列我们采用的是redis的stream实现,原因有两点,考虑到我们的系统主打轻量,低配置服务器运行, 使用redis可以做到复用,其次引入第三方消息中间件会增加系统复杂度,增加问题隐患,改进后的qps压测从4到26将近7倍提升 ## 遇到的问题 ### 1.有时候都把nacos相关的包都删除了,但是运行还是会报nacos链接不上的错,服了,明明前几次运行都还可以, 这次就不行了, 还特意从git仓库下来之前提交的代码结果还是报错,但是过会重新运行又不报错了 ### 2.在开发短链接核心模块时,创建短链接数据分片总是散列到t_link,而不是0-15的分表,之后才找到原因, 原来是shardingsphere配置文件写错了,文件名应该是shardingsphere-config.yaml,一定要有-config, 文件后缀不能是yml,必须是yaml ### 3.开发跳转功能时,总是设置方法名为goto,一直报错不允许在此处注解,后来才发现goto是java的关键字 ### 4.用域名访问测试跳转时要记得关闭vpn,不然访问的是127.0.0.1:7890,其次请求不要使用https,而是要http ### 4.自动注入的注解RequiredArgsConstructor,需要final修饰bean ### 5.在后台管理端远程调用短链接监控模块时,发生类型转换错误 离谱的点是还跟mybatis有关,不过原因可能在于中台端传递的参数继承一个Mybatis的Page泛型类并没有指明泛型, 而监控模块指定了,这里发生不一致,不过更离谱的是 Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'orders'; Cannot convert value of type 'java.lang.String' to required type 'com.baomidou.mybatisplus.core.metadata.OrderItem' for property 'orders[0]': no matching editors or conversion strategy found 还有什么order对象 ### 6.sql查询数据使出现异常,原因尽然是前端没传必要的参数使得默认为null,那么sql肯定报错 ### 7.项目部署到线上时,一开始运行正常,之后不知道怎么回事总是会报错,这个问题的难点是在本机上运行无法复现,只会出现在服务器上 org.redisson.client.RedisException: ERR Error running script (call to f_e678c622b160a7f36fe9f26aecd0c1a5992e5b0c): @user_script:1: user_script:1: Bloom filter config has been changed. channel: ### 8.对于前端部署,使用nginx部署和前端网页时,在本地运行总是不能显示前端只能显示nginx默认的页面, 但是在服务器上却可以,后来找了好久的bug, 才发现原来是site-default目录下的默认配置文件 default文件已经监听占用80端口所以导致访问的是nginx默认的页面,不过尽管发现了这个问题还是显示不了,查看nginx错误日志一直出现权限被拒绝,明明我都给所有前端文件最大的权限777 但他就是访问不了,后来我改变nginx配置让nginx以root用户运行,终于可以访问了!!!但是以www-data用户却访问不了,服务器上的却可以,这个问题以后再解决吧 ### 9.最近不知道怎么回事,后端运行总是提示端口被占用,8080和8081都被占用,服了,明明刚开机,也查了命令查看端口占用, 不管是linux还是windows查看都没显示具体占用的进程,这也是距离普 ### 10.wsl上部署的nginx竟然无法和本地服务通信,具体来讲就是80端口访问不了8080端口,但是使用5173端口却可以,修不尽的bug