首页 > 其他分享 >使用Go语言开发一个短链接服务:二、架构设计

使用Go语言开发一个短链接服务:二、架构设计

时间:2024-03-12 16:13:18浏览次数:24  
标签:架构设计 code MongoDB Redis Go Memcached 链接

  在上一篇中,我们介绍了短链接服务的应用场景、基本原理以及Go的基本代码实现。在这一篇,我们将讨论服务的技术选型和架构设计。

后端Web框架

  就无脑用Go最流行的Web框架Gin。

 

数据库

  备选方案包括MySQL、PostgreSQL、MongoDB。我们这里的数据存储,基本围绕短链接code和长链接url对应关系的保存和读取。这里我们选择MongoDB,理由有4:

      1、我们不需要用到关系型数据库的事务(MongoDB4.0后也支持事务,惊不惊喜、意不意外)、join查询等特性。绝大多数读写场景是围绕单条数据,短链接code和长链接url两个字段。

      2、MongoDB支持分布式、横向扩展。有朝一日,当我们的短链接服务火得一塌糊涂时,数据量级指数增长,数据库读写性能出现瓶颈、磁盘空间不足,可以直接通过加机器节点解决。

      3、在读取方面,MongoDB相对于MySQL、PostgreSQL具有更高的性能。主要因为MongoDB使用了面向文档的存储方式,可以将相关数据存储在一个文档中,从而减少了数据查询时的磁盘IO。

      4、在适量级的内存的MongoDB的性能非常迅速的,它将热数据存储在物理内存中,热数据的读写十分快。

  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
      2、MongoDB 7.0.6; go.mongodb.org/mongo-driver/mongo v1.14      

   3、Redis 7.2.4;github.com/redis/go-redis/v9

   下一篇我们将开始项目代码编写。 

 

标签:架构设计,code,MongoDB,Redis,Go,Memcached,链接
From: https://www.cnblogs.com/ALXPS/p/18067918

相关文章

  • go语言笔记
    学golang,我需要阅读一本go语言的书籍,也需要浏览和go相关的社区网站。有一个问题是,为什么需要阅读一本编程书籍?直接从网上搜索是可以找到很多快餐资料的,似乎比书籍更有效?答案是全面。通常,书的质量比博客高多了,我现在写的就是博客,算不上书籍。书籍的质量也体现在它的内容比较系统......
  • Dwango Programming Contest 6th D 题解
    正好测试一下专栏的题解系统。我省选寄了都怪洛谷/fn/fn/fn/fn/fn/fn/fn题解显然可以对于所有关系建有向边,显然是基环外向树森林。由于是字典序最小,因此找到最小的上一个点没有直接连向边的点一定最优。但是有时取最优会导致最后无法选完,我们考虑无法选完的情况。第一种是......
  • 【转】Command Pattern in Go (Golang)
     原文: https://www.sohamkamani.com/golang/command-pattern/ packagemainimport"fmt"//TherestaurantcontainsthetotaldishesandthetotalcleaneddishestypeRestaurantstruct{ TotalDishesint CleanedDishesint}//`NewRestaurant......
  • 一键开启 GPU 闲置模式,基于函数计算低成本部署Google Gemma 模型服务
    背景信息Google在2024年02月21日正式推出了自家的首个开源模型族Gemma,并同时上架了四个大型语言模型,提供了2B和7B两种参数规模的版本,每种都包含了预训练版本(base模型)和指令微调版本(chat模型)。根据Google的技术报告,本次开源的Gemma在问题回答、合理性、数学、代码......
  • [转]Golang Functional Options Pattern
     原文: https://golang.cafe/blog/golang-functional-options-pattern.html-------------------- GolangFunctionalOptionsPatternTheGo(Golang)FunctionaOptionsPatternisaway,apatternofstructuringyourstructsinGobydesigningaveryexpressivea......
  • Go 语言开发环境搭建
    Go语言开发环境搭建Go语言开发环境搭建一.GO环境安装1.1下载Go官网:https://golang.org/dl/Go镜像站(推荐):https://golang.google.cn/dl/1.2Go版本的选择默认下载最新自己对应的平台即可。  1.3安装1.3.1Windows安装打开下载的安装程序(.msi文件),然后按照......
  • Mac安装MongoDB
    本文是简单的安装步骤1.下载[MongoDB]社区版本5(https://www.mongodb.com/zh-cn)2.解压,重命名为mongodb,访达中使用command+shift+G搜索进入/user/local/,文件夹放在这里3.环境变量配置终端运行:open.bash_profile(没有的话在终端上创建touch.bash_profile)打开的文件中:expo......
  • golang练习题
    看到一个网站,上面每天发布一道golang练习题,正好拿来练习,顺便整理记录下来。iota,类似枚举值,每个const从0开始计数 String方法相当于java里的toStringgolang处于安全考虑,对指针运算做了很多限制。map的value是不可以取地址的。 ......
  • Django请求生命周期流程图
    Django请求生命周期流程图流程如下:浏览器发送请求(Http请求)web服务网关接口(Django默认的wsgiref模块不能承受高并发,最大只有1000左右)中间件>>缓存数据库(返回给中间件已经缓存过的数据)urls.py(路由层)views.py(视图层)templates(模板层:存放html静态......
  • Django
    Django配置与创建(1)创建Django项目django-adminstartproject文件名(2)启动Django文件pythonmanage.pyrunserver(3)创建apppythonmanage.pystartapp应用名#pythonmanage.pystartappapp01(4)注册app创建app后,如果想使用相关的功能,必须将创建的app注册到配置文件中......