使用Go语言开发一个短链接服务:二、架构设计
章节
源码:https://gitee.com/alxps/short_link
在上一篇中,我们介绍了短链接服务的应用场景、基本原理以及Go的基本代码实现。在这一篇,我们将讨论服务的技术选型和架构设计。
后端Web框架
就无脑用Go最流行的Web框架Gin。
数据库
备选方案包括MySQL、PostgreSQL、MongoDB。我们这里的数据存储,基本围绕短链接code和长链接url对应关系的保存和读取。这里我们选择MongoDB,理由有:
1、我们不需要用到关系型数据库的事务(MongoDB4.0后也支持事务,惊不惊喜、意不意外)、join查询等特性。绝大多数读写场景是围绕单条数据,短链接code和长链接url两个字段。
2、MongoDB支持分布式、横向扩展。有朝一日,当我们的短链接服务火得一塌糊涂时,数据量级指数增长,数据库读写性能出现瓶颈、磁盘空间不足,可以直接通过加机器节点解决,无需分库分表
3、在读取方面,MongoDB相对于MySQL、PostgreSQL具有更高的性能。主要因为MongoDB使用了面向文档的存储方式,可以将相关数据存储在一个文档中,从而减少了数据查询时的磁盘IO。
4、在适量级的内存的MongoDB的性能非常迅速的,它将热数据存储在物理内存中,热数据的读写十分快。
5、我们基本是单条数据读取,MongoDB索引(b树)b数相比Mysql索引(b+数)性能更高
Go的MongoDB驱动我们使用MongoDB官方维护的go.mongodb.org/mongo-driver/mongo 。
缓存
鲁迅说:“诸多策略,缓存为王。”
备选方案包括Redis、Memcached。我们的服务使用缓存需求,主要为保存和读取短链接code(作为key)和长链接url(作为value)。根据需求,Memcached可能是一个更好选择,但是我还是选择Redis。
应该选Memchached的理由:
1、不需要用到Redis丰富的数据类型、数据持久化、事务等特性,只需要简单的单key保存和读取
2、根据本人以往的认知,100k以上的数据中,Memcached性能要高于Redis
应该选择Redis的理由:
1、在新版的Redis 6.x版本中,支持多线程处理io,优化了过期算法和过期处理逻辑。上面说的,以往100k以上的数据中Memcached性能要高于Redis认知,如今不一定成立
2、更多人熟悉的是Redis
3、我不会Memcached
Go的Redis驱动我们使用MongoDB官方维护的github.com/redis/go-redis/v9 。
架构图
上一篇中,我们提到了短链接服务的基本原理是,服务维护了短链接和长链接一对一关系,客户端输入短链接,服务端获取到短链接code,到缓存、数据库获取对应的长链接,并http跳转到对应的长链接。
基本架构

流程图

总结
架构基本就设计如此,目前涉及到的组件版本信息如下:
1、Golang 1.22.0
2、Gin github.com/gin-gonic/gin v1.9.1
3、MongoDB 7.0.6; go.mongodb.org/mongo-driver/mongo v1.14
4、Redis 7.2.4;github.com/redis/go-redis/v9
下一篇我们将开始项目代码编写。
使用Go语言开发一个短链接服务:二、架构设计的更多相关文章
- 百度 谷歌 Twitter,这么多短链接服务(Short Url)究竟哪家强?
一.短链接是什么 url=HPqdQ5VR3vA39x7ZWoWyNzwWnsDhTbh66BTpdzsJLroBDzFRm4JV-G818Zc027uZrwe7zxtxnD4H2FUahftpUK& ...
- 用PHP和Python生成短链接服务的字符串ID
假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...
- Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务
短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...
- Java 网址短链接服务原理及解决方案
一.背景 现在在各种圈的产品各种推广地址,由于URL地址过长,不美观.不方便收藏.发布.传播以及各种发文字数限制等问题,微信.微博都在使用短链接技术.最近由于使用的三方的生成.解析短链接服务开始限制使 ...
- 短链接服务Octopus的实现与源码开放
前提 半年前(2020-06)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信.模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求.当时为了快速推广,使用了一些比较知名的 ...
- 最近做了一个短网址服务 di81.com
最近做了一个短网址服务: di81.com 项目中有一处需求,需要把长网址缩为短网址,把结果通过短信.微信等渠道推送给客户.刚开始直接使用网上现成的开放服务,然后在某个周末突然手痒想自己动手实现一 ...
- 从服务端架构设计角度,深入理解大型APP架构升级
随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...
- 使用plv8+hashids生成短链接服务
有写过一个集成npm plv8 以及shortid生成短链接id服务,实际上我们可以集成触发器自动生成url对应的短链接地址,hashids也是一个不错的选择. 以下是一个别人写的一个博客实现可以参考 ...
- 使用go语言开发一个后端gin框架的web项目
用liteide来开发go的后端项目,需要注意的是环境变量要配置正确了 主要是GOROOT, GOPATH, GOBIN, PATH这几个, GOPATH主要用来存放要安的包,主要使用go get 来 ...
- 用 Go 快速开发一个 RESTful API 服务
何时使用单体 RESTful 服务 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,而单体服务具有架构简单,部署简单,开发成本低等优点,可以帮助我们快速实现产品需求.我们在使用单体服务 ...
随机推荐
- 基于 junit5 实现 junitperf 源码分析
前言 上一节介绍了基于 junit4 实现 junitperf,但是可以发现定义变量的方式依然不够优雅. 那可以让用户使用起来更加自然一些吗? 有的,junit5 为我们带来了更加强大的功能. 拓展阅 ...
- Mybatis的缓存过期机制和RedisCache
MyBatis的缓存过期机制, flushInterval参数 在实际测试中, 发现Redis中的缓存数据TTL为-1, 在Hash中的key也无过期时间信息, 怀疑RedisCache的实现是否能正 ...
- springboot+vue+elementui实现文件上传下载删除DEMO
说明 前面搜索了几个关于springboot+vue+elementui上传下载的文章,感觉写的都不尽如人意.要么是功能不完善,不好用.再者就是源码提供的实在差劲,都不完整.一气之下,自己搞了一个实用 ...
- 掌握云容器网络:何为ipvs
本文分享自华为云社区<[理解云容器网络]2-基础篇-ipvs介绍>,作者: 可以交个朋友. IPVS简介 ipvs是工作在Linux内核态的4层负载均衡:和用户态的负载均衡软件(如ngin ...
- 「源码分析」CopyOnWriteArrayList 中的隐藏的知识,你Get了吗?
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 前言 ...
- win32-使用FillRect绘制具有渐变颜色的客户区域背景
void OnEraseBkGnd(HWND hwnd) { /* Vars */ HDC dc; /* Standard Device Context; used to do the paintin ...
- Docker方式快速启动一个Redis实例
安装Redis有多种方式,除了可以通过各个平台的软件包工具安装外,还可以直接从源码安装. 但是,安装Redis可能会遇到一些这样的问题,比如: 1.网络环境比较差,下载耗时比较长 2.从源码编译安装时 ...
- maven引入本地jar不能打入部署包的问题解决
引入的三方依赖 jar 包, scope 为 system 的包 maven 默认是不打包进去的,需要加这个配置 在pom.xml文件中找到spring-boot-maven-plugin插件,添加如 ...
- 数据抽取平台pydatax介绍--实现和项目使用
数据抽取平台pydatax实现过程中,有2个关键点: 1.是否能在python3中调用执行datax任务,自己测试了一下可以,代码如下: 这个str1就是配置的shell文件 try: resu ...
- ASP.NET Core MVC应用模型的构建[4]: Action的选择
ControllerModel类型的Actions属性包含一组描述有效Action方法的ActionModel对象.对于定义在Controller类型中的所有方法,究竟哪些方法才能成为有效的Actio ...