转转短链平台设计与实现

news2024/9/25 13:25:50

1 背景介绍

转转是中国领先的二手交易平台,链接作为用户在平台上进行交互和信息传递的重要媒介,扮演着不可或缺的角色。

传统长链接通常包含大量字符和特殊符号,不易记忆和传播。由于字数的原因,长链接在发送短信,生成二维码和社交平台发布等场合下会也有一定的局限性。

2 工作原理

2.1 短链接生成与存储

短链平台接收到业务方提供的长链接后,先通过哈希算法(MD5)检查是否已存在短链接映射关系,存在即返回,不存在则生成唯一 ID 标识(号段模式),再选择适当的短链接生成算法(Base62),将该唯一 ID 转换为短链接。生成的短链接与原始长链接之间的映射关系需要被持久化,以便在用户访问时能够快速地查找并定位到原始长链接。

2.2 短链接返回与传播

一旦短链接生成成功,短链平台将返回这个短链接给业务方。业务方可以通过多种方式将短链接传播给用户,如将其嵌入到网页中、发送短信、分享到社交媒体等。用户获得这个短链接后,就可以点击访问相应的资源。

2.3 用户点击与跳转

当用户点击短链接时,浏览器向短链平台发送请求。短链平台需要根据短链接查找映射关系,然后将用户正确引导到原始长链接的业务系统。这一步骤需要高效的数据检索和跳转机制。

HTTP 状态码 301 和 302 都能代表重定向,301 永久重定向会使用浏览器缓存导致统计短链访问次数不正确,302 临时重定向会每次都访问到短链平台从而增加服务压力。

3 核心算法

长链接到短链接的转换是短链平台的核心功能,这需要一个高效且唯一的算法来确保每个长链接都可以映射到一个对应的短链接。

3.1 哈希算法

3.1.1 MD5

MD5 是一种广泛应用的哈希算法,将输入数据转换为 128 位的哈希值,在短链平台中可以用于生成短链接的基础哈希值。

3.1.2 SHA-256

SHA-256 是一种更安全的哈希算法,它生成256位的哈希值。虽然相对于MD5,SHA-256更安全,但同时也会更长,影响了短链接的长度。

3.2 分布式 ID

直接使用哈希结果作为短链接时,哈希碰撞和链接长度都是需要考虑的问题。在短链平台中,需要采取措施来防止哈希碰撞,例如使用唯一性标识符。

3.2.1 全局递增

自增 ID 是另一种常见的分布式唯一 ID 生成方式,通过一个自增的计数器来生成唯一 ID。例如 MySQL 的自增主键,或者 Redis 的 incr 指令。这种方法简单且高效,适用于许多场景。

3.2.2 号段模式

号段模式会为不同的节点分配不同的号段范围,每个节点内部自增生成唯一的 ID,用完后再重新分配,从而确保全局唯一性。

3.2.3 SnowFlake

SnowFlake(雪花算法)是一种常用的分布式唯一 ID 生成算法,它将一个大整数 ID 拆分成多个部分,包括时间戳、机器 ID、数据中心 ID 和序列号等,从而保证了生成的 ID 是唯一且递增的。

然而,尽管雪花算法在分布式环境中生成唯一 ID 方面表现出色,但它并不免疫于时钟回拨问题。如果发生时钟回拨,可能会导致生成的 ID 在时间上产生逆序。

3.3 Base62 编码

Base62 编码是将数据转换为只包含数字和字母的一种方法。它使用了 62 个字符,分别是 0-9、a-z、A-Z,可以作为 URL 短链接、文件名等场景的字符串表示,相对于16进制或64进制等其他编码,Base62 具有更高的可读性和稳定性。

import java.util.ArrayList;
import java.util.List;

public class Base62Encoder {

    private static final String BASE62_CHARACTERS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    public static String encode(long num) {
        StringBuilder sb = new StringBuilder();
        do {
            int remainder = (int) (num % 62);
            sb.insert(0, BASE62_CHARACTERS.charAt(remainder));
            num /= 62;
        } while (num != 0);
        return sb.toString();
    }
}

仅 6 位的 Base62 编码,能表示约 568 亿(62 的 6 次方)的数。

4 安全与防护

在转转短链平台的设计与实现过程中,确保用户数据的安全性和平台的稳定性是首要任务。为此,我们采用了一系列安全与防护策略,以应对潜在的风险和威胁,保障用户隐私和系统的正常运行。

4.1 长链接合法性校验

在生成短链接之前,首先需要对用户提供的原始长链接进行验证,以确保链接指向的是合法且可信任的目标资源。

合法性校验通常涵盖以下几个方面:

  1. 主域名合法性: 首先,平台会解析原始长链接,提取其中的域名信息。然后,这个域名会与预先定义的合法域名列表进行比对,以确认链接是否指向了预期的域名。这样做可以有效地防止恶意链接或指向不安全网站的情况。
  2. 查询参数域名合法性: 链接中的查询参数域名也可能影响到用户安全。平台也需要验证这些域名是否合法,以免引发潜在的安全风险。

4.2 重复生成短链接防护策略

重复生成短链接的防护策略在短链平台的设计中具有重要意义。它旨在防止因重复生成相同的短链接而造成的资源浪费和系统混乱。

短链平台可以基于长链接的 MD5 值采用幂等性设计,确保多次相同请求的处理结果是一致的,不会产生额外的短链接。

4.3 短链接有效性验证

在用户点击或输入短链接后,短链平台需要快速准确地判断该链接是否有效,从而决定是否将用户重定向到原始长链接或提供相应的错误信息。

短链平台会通过查询数据库来验证短链接的有效性。如果短链接与有效的映射关系存在,平台将确认链接有效,否则将判定链接无效。

5 系统性能优化

系统性能的优化是确保转转短链平台高效、稳定运行的关键。通过采用一系列策略和技术,我们不断提升平台的响应速度、并发处理能力和资源利用效率,以满足用户的需求并提供卓越的用户体验。

5.1 数据库索引

数据库是短链平台的核心数据存储组件,因此优化数据库的设计和访问非常重要。将长链接的唯一标识 ID 作为主键索引,长链接的 MD5 值作为普通索引,以支持快速的链接有效性验证和重定向操作。

5.2 缓存应用

利用缓存技术可以显著减少数据库访问次数,从而提高系统的响应速度。我们采用了分布式缓存 Redis,将短链接映射关系异步存储在缓存中,减轻数据库的压力。这样可以在高并发情况下,快速地获取链接映射信息,提升用户访问的效率。

5.3 号段模式优化

传统号段模式在节点消耗完所有号段时才会向发号器请求分配新的号段,这可能会引起短时间内的性能瓶颈。我们引入独立的监控线程定期检查号段的使用情况,一旦使用 ID 数量超过阈值时就请求分配新的号段。新的号段模式能够在高并发情况下平稳地切换号段,通过预先分配号段以避免阻塞业务流程,从而提高系统的性能和稳定性。

5.4 分表策略

随着用户数量和链接数据的增长,单一数据库表可能会面临性能瓶颈。为了应对这个问题,我们采用了分表策略。将链接数据按照唯一性 ID 对 64 取余的规则均匀拆分到 64 张表中,可以有效减轻单一表的压力,提高数据库的扩展性和性能。

5.5 业务监控

业务监控是系统关键环节之一,旨在实时追踪系统的性能和运行状况,以确保高可用性和高性能。借助转转监控系统 Prometheus,我们可以收集和展示关键的性能指标,如生成短链链接和获取长链接的请求频率,链接的安全性校验情况等等,使能够一目了然地查看系统运行情况,从而更好地进行决策和优化。

6 总结

通过深入的研究和实践,转转的短链平台为用户提供了高效、安全的链接服务。在不断发展的互联网环境下,短链平台将持续创新,满足用户不断变化的需求。

关于作者:

曹建涛,转转C2C&寄卖业务研发工程师

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

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

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

相关文章

策略模式【Strategy Pattern】

刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看…

Linux 的基本使用

1、Linux 是什么 Linux 是一个操作系统. 和 Windows 是 "并列" 的关系 Linux 严格意义来说只是一个 "操作系统内核". 一个完整的操作系统 操作系统内核 配套的应用程序. CentOS 和 RedHat 的关系 RedHat一直都提供源代码的发行方式,Cent…

【MySQL系列】表约束的学习

「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值(default)1.3 列描述(comment)1.4 zerofill1.5 主键(primary ke…

新型网络安全:从过程到明确结果

内容 过去的情况网络安全是理论性的,结果才是实际性的。这可能吗?我们现在的努力方向结论 本文讲述了为什么企业必须重新思考其网络安全方法:旧方法是否足够有效,是否可以完全适用?公司应采取哪些行动来实现内部信息…

【Spring Boot】构建RESTful服务 — RESTful简介

RESTful简介 本节将从基础的概念开始介绍什么是RESTful、RESTful的特点、RESTful中的资源、HTTP Method、HTTP Status,还将介绍RESTful和SOAP到底有哪些区别。 1.什么是RESTful RESTful是目前流行的互联网软件服务架构设计风格。REST(Representationa…

HCIA---路由器--静态路由

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.路由器简介 路由器是一种网络设备,用于将数据包从一个网络发送到另一个网络…

系统架构设计师-系统可靠性分析与设计

目录 一、可靠性相关基本概念 二、可靠性指标 1、串联系统与并联系统可靠性指标计算 2、混合系统 三、可靠性设计 1、影响软件可靠性的主要因素: 2、增加可靠性的解决方案 2.1 避错技术 2.2 降低复杂度设计 2.3 检错技术 2.4 容错技术 3、双机容错 一、可靠性相关…

当涉及到Python计算结果的责任时,谁来负责呢?

代码质量和测试:在发布之前,通常会进行代码测试以确保基本的错误被避免。对于广泛使用的库和框架,如numpy、scipy和pandas,其代码正确性经过了充分的测试和验证,用户可以放心使用。社区维护和开发者:Python…

自编码器的学习

先奉上视频 https://www.bilibili.com/video/BV1Vx411j78H/?spm_id_from333.788.recommend_more_video.-1&vd_sourceeb433c8780bdd700f49c6fc8e3bd0911

MySQL — MVCC

文章目录 MVCCMVCC 实现原理隐藏字段undo logundo log的用途undo log类型 版本链ReadView MVCC InnoDB是一个多版本的存储引擎。它保留有关已更改行的旧版本的信息,以支持并发和回滚等事务性特性。这些信息存储在undo表空间中的数据结构称为回滚段。InnoDB使用回滚…

三天吃透Java面试八股文(2023最新整理),面试通过率高达90%

什么样的求职者能够获得面试官的青睐?求职者需要准备哪些内容来面对形形色色的面试官?这两份资料是我在几十场面试中被面试官问到的问题,比其他复制粘贴的面试题强一百倍,堪称全网最强(我不太喜欢“全网最强”这样的字…

《连锁零售超市经营数据分析实战》学习笔记

这篇文章整理自 接地气的陈老师 x 和鲸社区 | 连锁零售超市经营数据分析实战 活动业务讲解会【接地气的陈老师】的讲解 更多数据分析动手实践活动欢迎访问>>和鲸社区活动 活动背景 现在你是某零售企业的商业数据分析师,你为管理层提供日常经营数据。到一年年…

【JAVA开发工具系列】Git

Git常用功能整理 1.自动打包1.1 第一步安装git 服务1.1.1 查看版本1.1.2 安装1.1.3 配置秘钥 1.2 第二步 配置maven1.2.1 下载1.2.2解压1.2.3 配置环境变量1.2.4刷新环境变量文件1.2.5测试环境1.2.6 修改数据源 1.3 部署项目1.3.1拉取项目 1.4 jar 重启tomcat 2.SmartGit合并主…

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-2.确定交互所需的后端API(二)

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-2.确定交互所需的后端API(二) 参考微信小程序-小柠AI智能聊天,可自行先体验。 根据上一节的小程序静态页面设计,需要从后端获取数据的主要4个点: 登录流程;获取今日已提问次数&a…

财税数字化时代,RPA在多大程度上为财务部门实现降本增效?

企业数字化转型,财务是一个重要的切入点。随着数字化业务不断展开,新的系统、流程和数据源被不断引入,财务部门面临的是不断暴增的对账、处理报表、审计等日常工作。 如此大的工作量,即使是经验丰富的资深财务,也难免…

无服务器、Rust,都是旧技术的二次创业!

原文标题:​​Serverless Is the New Timeshare​​,作者:Shai Almog 还记得大型机吗?无服务器就好比如:我们拥有这台机器,你来我这里租借。创新往往都是在踩在巨人肩膀上诞生! 分时度假是一种…

Maven基础总结

前言 Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。 基本要求掌握 配置Maven环境直接查。 得会在IDEA创建Maven的java项目吧、会创建Maven的web项目吧、会创建多模块项目吧。 得会配置插件pligin、依赖dependency吧 一、Maven四大特性 1、…

利用Google Docs的评论功能投递钓鱼链接

情报背景 利用Google drive等可信云服务进行的网络钓鱼攻击活动日益增长,这种攻击手段利用了高可信度的云服务骗取受害者的信任,并且可以绕过基于域名的安全策略。 近期Avanan公司发现了一种新的邮件钓鱼方式,攻击者利用Google docs的评论功…

【CAS定制】定制化密码编码器--支持密码组合编码或加密 PasswordEncoder

CAS中,默认支持的PasswordEncoder只能通过一种密码算法进行编码或加密,但是日常场景经常存在组合编码的需求,这就需要我们去定制一种支持密码组合编码或加密的编码器。 文章目录 场景定制目标定制方案定制代码 场景 一般项目中有很多需要进行…

HTTP协议讲解

HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核…