Design a TinyURL

news2025/1/15 17:31:32

title: Notes of System Design No.02 — Design a TinyURL
date: 2022-05-05 13:23:57
tags: 系统设计
categories:

  • 系统设计

description: " Design a TinyURL"


1.Functional Requirements

  • 1.长链接->短链接(写)

  • 2.短链接->长链接(读)

  • 3.可以设置超时时间

  • 4.相同的长链接映射到不同的短链接上

    1. 短链接的长度应该尽量短
  • 6.短链接应该不可预测

2.Non-Functional Requirements

一般系统设计的非功能性指标都会从这几方面来考量

  • 1.高可用性 :不能有单点失败
  • 2.可扩展性 :能够方便的针对大量请求扩充
  • 3.低延迟性: 读写的延迟尽量低
  • 4.强一致性:
强一致性:系统中的某个数据被成功更新后,
后续任何对该数据的读取操作都将得到更新后的值;

弱一致性:系统中的某个数据被更新后,
后续对该数据的读取操作可能得到更新后的值,
也可能是更改前的值。但经过“不一致时间窗口”这段时间后,
后续对该数据的读取都是更新后的值;

最终一致性:是弱一致性的特殊形式,
存储系统保证在没有新的更新的条件下,
最终所有的访问都是最后更新的值。

在这个系统里面,要求的是强一致性。也就是说每次写请求更新完数据以后,进行读请求立马就能得到更新完的数据

  • 5.持久性:不能丢数据
  • 6.Read Heavy: 读写比例= 100:1

3.Assumption

  • 假定短URL的字符组成->7个字符的Base64构成
  • 假定每秒写100K次->1.4年可以耗尽7个字符长度的URL-> 89.6年可以耗尽8个字符构成的URL
  • 假定长URL 最多有2083个字符长度构成

按照以上假设

  • 在数据库中整个长短链接映射数据长度为2095(8个字符长度的短URL+ 2083个字符长度的长URL+4个字符长度的超时时间设定)
  • 每秒100K次写请求 则每年会写入6599TB的数据
  • 这么大的数据需要做Partition

4. API

5. High Level Design

写请求(长URL->短URL)

  • 请求过来以后,负载均衡LB把请求分配到期中的一台App Server。为保证不会单点失败,App Server至少需要三台,因为如果是两台的话 如果其中一台正在升级维护,那么请i去就会全部的发到另外一台机器上 造成那台机器的过载.

  • Monitor监控每台App Server 的CPU 内存 网络 磁盘等等 ,达到某一个阈值的时候 动态的增加或者减少某一个机器的请求

  • DB存储长短链接映射的数据。需要对数据做Prtition,每个partition还需要做Replica复制备份,保证高可用

  • MemCache缓存数据库中产常见数据 减少延迟

  • App Server中由短链接映射生成长链接(Key Generation)的方式可以有以下几种

1. Random String
随机生成八位的字符串

问题1:不同的AppServer处理相同的长URL的时候有可能会生成相同的字符串

措施2: 可以对不同的App Server 分配一个两位不同的前缀,后六位随机生成。

缺点: 相同的App Server
重复处理相同的长URL的时候 有可能已经生成过了存在数据库里了 这个时候需要先检查数据库,再不断的重新用随机生成算法 直到生成一个不同的字符串
2.MD5
Long URL-->MD5-->128bits number -->base64-->21char string -->Sub string -->  前8 chars strign 

如果产生冲突 就在长URL的前面或者后面随机的增加一些字符,重新的走一遍这个过程

Ref:

MD5

Base64

先用MD5算法 处理原来的长链接 得到128bit的二进制数据

再用Base64编码这个128bit 二进制 ,得到一个大于21个字符的数据

在从这21左右字符里面 挑头6个或者8个作为最终的短链接编码

缺点:和上面一样 如果生成以后 检查数据库发现有冲突 那么就需要重新走一遍流程 再次生成随机串 直到没有冲突 ,增加了延迟

3. 维护一个专门的 Key Generation服务
用来专门生成短URL key

机制:

  • 这个服务会提前在线下生成一堆短URL 存在数据库中,当App Server 需要一个新短URL的时候 就从这个数据库中获取 标记为已使用
  • 这里增加的App Server也需要LB负载均衡和多个App Server 还有数据库也需要Partition和Replica.
    优势:
  • 这种方式把冲突放到了线下 而不是线上 减少了延迟

改进:

  • 可以设定App Server 每次从Key Generation模块取短URL的时候 ,每次取批量的URL 存在自己的内存里 一直到它把自己的url用完才重新去 Key Generation模块取
4.维护一个全局的计数器

机制:

  • 每一个App Server读取全局的计数器,更新计数。
  • 然后在App Server里面
    把读取到的计数器转换为64进制数,把64进制串作为新的短链
  • App Server 操作全局计数器的时候要加锁
  • 这样的方式全局计数器的QPS比较高

改进:

  • App Server每一次不是取一个数,而是取一个范围.在某一个App Server
    要素:
  • 某一个App Server宕机了,损失了一部分范围数怎么半?

不用担心,因为只是损失一部分 损失不大

  • 每个App server 读取时候设定的范围是多大呢?

可以用每秒写的次数/App server的机器数,比如每秒100000writes,有20个App server 则设定的范围可以是 100000/20=5000

  • 这种方式生成的短url是可被预测的吗?

不是的 因为在用户发送请求到LB负载均衡的时候,分发到的App server是不确定的。不同的App server维护的计数范围是不同的

要实在担心会出现可预测的问题,可以在App server读取全局计数器生成范围的时候 用洗牌算法 把范围打乱,这样就不会按照顺序依次分配

全局计数器的实现方法:

  • 关系型数据库

要保证读写串行化 以及加锁解锁方法 可以用关系型数据库实现。

  • ZooKeeper

Zookeeper有分布式的配置管理,可以实现上述的功能需求

对比

6. Low Level Design

DB Schema

  • 只需要一张表 三个字段就可以

  • 关系型数据库和非关系型数据库的比较

  • 选择非关系型数据库的理由

Workflow

  • 由长URL创建一个短URL的流程

  • 由短URL读取一个长URL的流程

7. Dive Deep

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unittest框架

unittest框架1.通过unittest框架创建测试2.通过unittest框架添加断言3.自动化用例管理TestLoader类的用法4.unittest智能封装等待1.通过unittest框架创建测试 1.必须继承于unittest.TestCase类 2.可以定义setUp和tearDown方法进行初始化,每条测试用例开始或结束会执…

谷歌浏览器-chrome浏览器占用电脑CPU过高、容易崩溃的解决办法

一、问题背景 最近特别难受的一点——谷歌浏览器总是莫名其妙崩溃,而且明明是只开了两三个标签页的情况下。 不管是谷歌自己的任务管理器,还是win10自带的任务管理器;在崩溃情况下,谷歌浏览器的电脑cpu占用率高达80以上。 网上…

Java01-JDK1.8下载安装教程(win11版)

文章导航JDK 1.8 官网下载(下载慢)百度网盘下载(下载快)安装过程JDK环境配置教程验证JDK是否安装成功使用JDK1.8的原因当下互联网行情以及个人建议JDK 1.8 官网下载(下载慢) 点击跳转至JDK1.8官方网址 32…

暴雪和网易分手百万玩家何去何从

暴雪和网易分手百万玩家何去何从 这两天看到很多报道说网易与暴雪分手的消息,作为一个游戏玩家我甚是感到很意外。 看了不少相关的报道消息才有了今天的这篇文章 暴雪和其旗下《魔兽世界》等游戏陪伴了我们这一代人成长,或许终究不属于这个时代。看到暴…

智慧路灯解决方案-最新全套文件

智慧路灯解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧路灯全套最新解决方案合集一、建设背景 智慧城市是利用信息通信技术感知、分析、整合城市运行核心系统的各种关键信息,从而改善民生、环保、公共安全、城市服务、智能响应包括工…

【Java八股文总结】之反射

文章目录Java反射一、泛型1、何为泛型?2、泛型通配符Q:泛型擦除是什么?3、泛型上限和下限二、反射1、何为反射?2、反射有什么用?3、反射应用场景有哪些?Q:反射的优缺点?4、反射获取C…

三极管集电极电阻的作用

放大状态:电流信号转变为电压信号 饱和状态 ;发射极正偏,集电极反偏 当有无电阻的作用。当集电极有电阻时,可以得到随IC电流变化的电压信号,当工作在饱和状态。集电阻电阻越大。越容易进入饱和状态.当Ib有个小电流,Ic会出现大的…

Dubbo的SPI机制

目录 什么是 SPI Java SPI 示例 Java SPI 源码分析 想一下 Java SPI 哪里不好 Dubbo SPI Dubbo SPI 简单实例 Dubbo 源码分析 getExtensionClasses Adaptive 注解 - 自适应扩展 Adaptive 注解在类上 Adaptive 注解在方法上 WrapperClass - AOP injectExtension - …

webpack 官方文档解读一(详细使用教程) 起步

什么是webpack 就是个打包工具。通过一系列插件帮你优化项目,压缩,混淆等。总之什么脏活累活都能干。 入门案例 创建一个目录,并安装webpack和webpack-cli这两个包。webpack包是webpack本体,webpack-cli是他提供的工具包。 mk…

RTL8380M/RTL8382M管理型交换机系统软件操作指南二:转发表

前面介绍了端口配置,这次对转发表进行详细的描述,主要包括以下三方面内容:基础配置、转发表、删除1.1 基础配置 1.1.1 老化时间 老化时间是一个影响交换机学习进程的参数。从一个地址记录加入地址表以后开始计时,如果在老化时间内各端口未收…

ResNet网络详解

ResNet ResNet在2015年由微软实验室提出,斩获当年lmageNet竞赛中分类任务第一名,目标检测第一名。获得coco数据集中目标检测第一名,图像分割第一名。 ResNet亮点 1.超深的网络结构(突破1000层) 2.提出residual模块 3.使用Batch Normalizat…

java项目-第147期ssm社区生活超市管理系统_(spring+springmvc+mybatis+jsp)_java毕业设计_计算机毕业设计

java项目-第147期ssm社区生活超市管理系统_(springspringmvcmybatisjsp)_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm社区生活超市管理系统》 该项目分为3个角色,管理员、用户、供应商角色。 用户可以浏览前台商品,进行…

[附源码]java毕业设计软件项目过程管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

牛客小白月赛 61 E 排队

题目大意: n个数,共有n!种排列方式,记Pi(a)表示序列a的第i种排队方式,cnt(Pi(a))表示P(i)的逆序对个数,PLMM想知道这n!种排列方式共有多少对逆序对 给定一个 nnn 个数,在所有排列顺序…

Windows 11 Insider Preview Build 25247.1000(rs_prerelease)更新内容

微软于今日推出了新的Dev预览版25247.1000,引入了电源设置的新能源建议,“帐户”页面现在会在 OneDrive 存储空间不足时显示警告。下面就和小编一起来看看详细的更新内容吧。 更新内容 此版本包括一些新功能,包括能源建议、任务管理器的一些改…

MySQL8.0优化 - 锁 - 从数据操作的类型划分:读锁、写锁

文章目录学习资料锁的不同角度分类锁的分类图如下从数据操作的类型划分:读锁、写锁读锁写锁锁定读MySQL8.0新特性写操作学习资料 【MySQL数据库教程天花板,mysql安装到mysql高级,强!硬!-哔哩哔哩】 【阿里巴巴Java开…

【21-业务开发-基础业务-商品模块-分类管理-商品系统三级分类的新增类别前后端代码实现-商品系统三级分类的更新类别前后端代码实现-之前错误的Bug修正】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

2022 全网最全最新 Java 面试题 - 独家内部教材

怎样才能拿到大厂的 offer,没有掌握绝对的技术,那么就要不断的学习 从疫情破局而出,又在毕业季一路过关斩将,我是如何笑面试官,拿到阿里,腾讯等八家大厂的 offer 的呢,在这里分享我的秘密武器&…

kubernetes(K8S)学习笔记P3:集群 YAML 文件(部署)

集群 YAML 文件(部署)4.集群 YAML 文件(部署)4.1 YAML 文件概述4.2YAML 文件书写格式4.2.1YAML 介绍4.2.2YAML 基本语法4.2.3YAML 支持的数据结构4.3资源清单描述方法4.3.1常用字段4.3.2字段解释4.4快速编写yml-->kubdectl cre…

数据结构由中序序列和后序序列构造二叉树

2022.11.19 由中序序列和后序序列构造二叉树任务描述相关知识编程要求测试说明C/C代码任务描述 本关任务要求采用中序遍历序列和后序遍历序列构造二叉树。 相关知识 给定一棵二叉树的中序遍历序列和后序遍历序列可以构造出这棵二叉树。例如后序序列是DEBFGCA,中序…