国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

100萬QPS短鏈系統如何設計?

開發 前端
為了從根本上改善這一痛點,本文將系統介紹如何基于 Spring Boot 3.4.5 + Spring Cloud Context 實現無需重啟即可動態更新配置文件的機制,覆蓋原理解析、實戰代碼、注意事項,助你提升至少 50% 的配置變更效率。

前言

凌晨兩點,監控大屏突然飆紅——短鏈服務QPS突破80萬! 數據庫連接池告急,Redis集群響應延遲突破500ms。

這不是演習,而是某電商平臺大促的真實場景。

當每秒百萬級請求涌向你的短鏈服務,你該如何設計系統?

今天這篇文章跟大家一起聊聊100萬QPS短鏈系統要如何設計?

希望對你會有所幫助。

最近建了一些工作內推群,各大城市都有,歡迎各位HR和找工作的小伙伴進群交流,群里目前已經收集了不少的工作內推崗位。

1.短鏈系統的核心挑戰

首先我們一起看看設計一個高并發的短鏈系統,會遇到哪些核心的挑戰。

如下圖所示:

圖片圖片

百萬QPS下的三大生死關:

  • ID生成瓶頸:傳統數據庫自增ID撐不住百萬并發
  • 跳轉性能黑洞:302重定向的TCP連接成本
  • 緩存雪崩風險:熱點短鏈瞬間擊穿Redis

2.短鏈生成

2.1 發號器的設計

發號器是短鏈系統的發動機。

方案對比:

方案

吞吐量

缺點

適用場景

UUID

5萬/s

長度長,無法排序

小型系統

Redis自增ID

8萬/s

依賴緩存持久化

中型系統

Snowflake

12萬/s

時鐘回撥問題

中大型系統

分段發號

50萬/s

需要預分配

超大型系統

分段發號器實現(Java版):

public class SegmentIDGen {
    privatefinal AtomicLong currentId = new AtomicLong(0);
    privatevolatilelong maxId;
    privatefinal ExecutorService loader = Executors.newSingleThreadExecutor();

    public void init() {
        loadSegment();
        loader.submit(this::daemonLoad);
    }

    private void loadSegment() {
        // 從DB獲取號段:SELECT max_id FROM alloc WHERE biz_tag='short_url'
        this.maxId = dbMaxId + 10000; // 每次取1萬個號
        currentId.set(dbMaxId);
    }

    private void daemonLoad() {
        while (currentId.get() > maxId * 0.8) {
            loadSegment(); // 號段使用80%時異步加載
        }
    }

    public long nextId() {
        if (currentId.get() >= maxId) thrownew BusyException();
        return currentId.incrementAndGet();
    }
}

關鍵優化

  • 雙Buffer異步加載(避免加載阻塞)
  • 監控號段使用率(動態調整步長)
  • 多實例分段隔離(biz_tag區分業務)

2.2 短鏈映射算法

短碼映射將長ID轉換成62進制的字符串。

轉換原理:

2000000000 = 2×62^4 + 17×62^3 + 35×62^2 + 10×62 + 8 
           = "Cdz9a"

原始ID: 2000000000,轉換為62進制的值為Cdz9a。

// Base62編碼(0-9a-zA-Z)
publicclass Base62Encoder {
    privatestaticfinal String BASE62 = 
        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    
    public static String encode(long id) {
        StringBuilder sb = new StringBuilder();
        while (id > 0) {
            sb.append(BASE62.charAt((int)(id % 62)));
            id /= 62;
        }
        return sb.reverse().toString();
    }
    
    // 測試:生成8位短碼
    public static void main(String[] args) {
        long id = 1_000_000_000L;
        System.out.println(encode(id)); // 輸出:BFp3qQ
    }
}

編碼優勢:

  • 6位短碼可表示 62^6 ≈ 568億種組合
  • 8位短碼可表示 62^8 ≈ 218萬億種組合
  • 無意義字符串避免被猜測

3.存儲架構

3.1 數據存儲模型設計

圖片圖片

3.2 緩存層級設計

圖片圖片

3.3 緩存擊穿解決方案

// Redis緩存擊穿防護
public String getLongUrl(String shortCode) {
    // 1. 布隆過濾器預檢
    if (!bloomFilter.mightContain(shortCode)) {
        returnnull;
    }
    
    // 2. 查Redis
    String cacheKey = "url:" + shortCode;
    String longUrl = redis.get(cacheKey);
    if (longUrl != null) {
        return longUrl;
    }
    
    // 3. 獲取分布式鎖
    String lockKey = "lock:" + shortCode;
    if (redis.setnx(lockKey, "1", 10)) { // 10秒超時
        try {
            // 4. 二次檢查緩存
            longUrl = redis.get(cacheKey);
            if (longUrl != null) return longUrl;
            
            // 5. 查數據庫
            longUrl = db.queryLongUrl(shortCode);
            if (longUrl != null) {
                // 6. 回填Redis
                redis.setex(cacheKey, 3600, longUrl);
            }
            return longUrl;
        } finally {
            redis.del(lockKey);
        }
    } else {
        // 7. 等待重試
        Thread.sleep(50);
        return getLongUrl(shortCode);
    }
}

防護要點:

  • 布隆過濾器攔截非法短碼
  • 分布式鎖防止緩存擊穿
  • 雙重檢查減少DB壓力
  • 指數退避重試策略

4.跳轉優化

4.1 Nginx層直接跳轉

server {
    listen 80;
    server_name s.domain.com;

    location ~ ^/([a-zA-Z0-9]{6,8})$ {
        set $short_code $1;

        # 查詢Redis
        redis_pass redis_cluster;
        redis_query GET url:$short_code;

        # 命中則直接302跳轉
        if ($redis_value != "") {
            add_header Cache-Control "private, max-age=86400";
            return 302 $redis_value;
        }

        # 未命中轉發到后端
        proxy_pass http://backend;
    }
}

性能收益:

  • 跳轉延遲從100ms降至5ms
  • 節省后端服務器資源
  • 支持百萬級并發連接

4.2 連接池優化

連接池優化可以用Netty實現:

// Netty HTTP連接池配置
publicclass HttpConnectionPool {
    privatefinal EventLoopGroup group = new NioEventLoopGroup();
    privatefinal Bootstrap bootstrap = new Bootstrap();
    
    public HttpConnectionPool() {
        bootstrap.group(group)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.SO_KEEPALIVE, true)
            .handler(new HttpClientInitializer());
    }
    
    public Channel getChannel(String host, int port) throws InterruptedException {
        return bootstrap.connect(host, port).sync().channel();
    }
    
    // 使用示例
    public void redirect(ChannelHandlerContext ctx, String longUrl) {
        Channel channel = getChannel("target.com", 80);
        channel.writeAndFlush(new DefaultFullHttpRequest(
            HttpVersion.HTTP_1_1, 
            HttpMethod.GET, 
            longUrl
        ));
        // 處理響應...
    }
}

優化效果:

  • TCP連接復用率提升10倍
  • 減少80%的TCP握手開銷
  • QPS承載能力提升3倍

5.百萬QPS整體架構

百萬QPS整體架構如下圖所示:

圖片圖片

核心組件解析:

1)接入層

  • CDN:緩存靜態資源
  • Nginx:處理302跳轉,本地緩存熱點數據

2)緩存層

  • Redis集群:緩存短鏈映射
  • 布隆過濾器:攔截非法請求

3)服務層

  • 短鏈生成:分布式ID服務
  • 映射查詢:高并發查詢服務

4)存儲層

  • MySQL:分庫分表存儲映射關系
  • TiKV:分布式KV存儲ID生成狀態

6.容災設計

6.1 限流熔斷策略

基于Sentinel的熔斷降級:

public class RedirectController {
    @GetMapping("/{shortCode}")
    @SentinelResource(
        value = "redirectService", 
        fallback = "fallbackRedirect",
        blockHandler = "blockRedirect"
    )
    public ResponseEntity redirect(@PathVariable String shortCode) {
        // 跳轉邏輯...
    }
    
    // 熔斷降級方法
    public ResponseEntity fallbackRedirect(String shortCode, Throwable ex) {
        return ResponseEntity.status(503)
            .body("服務暫時不可用");
    }
    
    // 限流處理方法
    public ResponseEntity blockRedirect(String shortCode, BlockException ex) {
        return ResponseEntity.status(429)
            .body("請求過于頻繁");
    }
}

6.2 多級降級方案

使用多級降級方案:

圖片圖片

保證服務的高可用。

6.3 數據分片策略

基于短碼分庫分表:

public int determineDbShard(String shortCode) {
    // 取短碼首字母的ASCII值
    int ascii = (int) shortCode.charAt(0);
    // 分16個庫
    return ascii % 16;
}

public int determineTableShard(String shortCode) {
    // 取短碼的CRC32值
    CRC32 crc32 = new CRC32();
    crc32.update(shortCode.getBytes());
    // 每庫1024張表
    return (int) (crc32.getValue() % 1024);
}

這里成了16個庫,每個庫有1024張表。

7.性能壓測數據對比

優化點

優化前QPS

優化后QPS

提升倍數

原始方案

12,000

-

1x

+Redis緩存

120,000

10x


+Nginx直跳

350,000

2.9x


+連接池優化

780,000

2.2x


+布隆過濾器

1,200,000

1.5x



壓測環境:32核64G服務器 × 10臺,千兆內網

總結

百萬QPS短鏈架構核心要點如圖所示:

圖片圖片

四大設計原則:

  • 無狀態設計:跳轉服務完全無狀態,支持無限擴展
  • 讀多寫少優化:將讀性能壓榨到極致
  • 分而治之:數據分片,流量分散
  • 柔性可用:寧可部分降級,不可全線崩潰

真正的架構藝術不在于復雜,而在于在百萬QPS洪流中,用最簡單的路徑解決問題。當你的系統能在流量風暴中優雅舞蹈,才是架構師的巔峰時刻。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2025-09-28 01:50:00

2022-09-13 17:45:40

長網址短鏈系統

2024-11-12 08:13:09

2024-11-19 16:31:23

2022-09-13 08:01:58

短鏈服務哈希算法字符串

2022-10-09 14:15:42

短鏈設計

2023-08-10 10:13:35

轉轉短鏈平臺

2025-06-04 03:15:00

高并發短鏈系統

2025-04-30 08:56:34

2023-07-26 13:29:43

高性能短鏈系統

2025-09-15 10:05:00

后端URL短鏈

2024-07-22 11:48:42

2019-05-05 09:28:59

架構數據查詢

2019-07-29 14:40:26

架構存儲檢索

2024-06-28 09:59:35

2015-05-15 13:21:22

URL系統設計

2022-11-21 09:57:18

網關系統

2025-04-27 01:22:00

QPS高并發MySQL

2025-04-27 10:10:04

2022-02-09 20:50:46

短鏈系統場景
點贊
收藏

51CTO技術棧公眾號

一区二区在线影院| 亚洲一区中文日韩| 超碰97在线人人| 久久久免费毛片| 亚洲成年人在线| 毛片免费不卡| 色婷婷亚洲综合| 在线香蕉视频| 中文字幕中文字幕中文字幕亚洲无线| 3d动漫一区二区三区| 国产精品亚洲成人| 国产性生活免费视频| 精久久久久久久久久久| 亚洲精品国产精品国自产| 久久一二三四| 日韩欧美在线一区二区| 肉色丝袜一区二区| 日韩中文一区二区三区| 亚洲免费影视| 精品免费视频123区| 18成人免费观看视频| 成人女人免费毛片| 91久久综合| 亚洲免费在线观看| 97国产精东麻豆人妻电影| 亚洲美女色播| 成人91在线观看| 午夜剧场成人观在线视频免费观看| 国产最顶级的黄色片在线免费观看| 亚洲高清免费在线观看| 国产一区二区三区在线观看精品| 少妇免费毛片久久久久久久久| 亚洲午夜极品| 免费观看国产成人| 91久久久亚洲精品| 日韩 欧美一区二区三区| 中文字幕97| 波多野结衣中文字幕一区二区三区 | 国产va在线视频| 亚洲国产精品999| 国偷自产一区二区免费视频| 日韩一区二区三区国产| 秋霞蜜臀av久久电影网免费 | 亚洲图片欧美视频| 国产一级片在线| 日韩欧美的一区二区| 日本中文字幕一区二区| 欧美高清激情视频| 久久一区二区三区喷水| 极品校花啪啪激情久久| 国产精品911| av在线dvd| 欧美男女性生活在线直播观看| 成人在线黄色电影| 久久久久久美女| 国产综合色产| 青青草成人免费在线视频| 亚洲动漫第一页| 天堂av在线| 国产suv精品一区二区三区88区| 亚洲欧美日本视频在线观看| 少妇性饥渴无码a区免费| 欧美午夜精品久久久久久久| 345成人影院| 成人激情春色网| www.日韩精品| 成年人免费在线视频| 日韩亚洲欧美中文高清在线| 91一区二区| av日韩一区二区三区| 一本一道波多野结衣一区二区 | 久久久亚洲精品无码| 亚洲777理论| 欧美成人免费电影| 91精品久久久久久久久| 国产成人综合在线播放| 久久这里精品| 欧美夫妻性生活视频| 全国精品久久少妇| 嫩草影院发布页| 亚洲色图综合网| 黄色精品免费| 成人网址大全| 国产亚洲xxx| 亚洲人www| 免费av网页| www.亚洲男人天堂| 日韩高清电影一区| 在线黄色av| 2018国产精品视频| 国产成人在线视频网站| 国产综合在线观看| 欧洲午夜精品久久久| 成人黄色一级视频| 八戒八戒神马在线电影| 国产精品久久中文| 国产日韩精品一区| 国产伦子伦对白在线播放观看| 亚洲精品欧美日韩专区| 国产精品国产精品国产专区不片| 日本久久免费| 人偷久久久久久久偷女厕| 欧美日韩一二三四五区| 欧洲亚洲视频| 亚洲第一中文av| 俺去亚洲欧洲欧美日韩| 国产一区二区三区在线观看免费视频 | 最新av电影| 欧美精品手机在线| 精品一区二区三区在线播放| 极品白浆推特女神在线观看| 欧美中文在线观看| 国产午夜精品福利| 先锋影音网一区二区| 中文字幕在线乱| 亚洲а∨天堂久久精品9966| 亚洲性图久久| 亚洲裸体视频| 国产精品久久久久久久7电影| 久久久五月婷婷| 青青在线精品| 日韩精品 欧美| 在线精品国产成人综合| 韩国av一区二区| 免费影视亚洲| 亚洲欧洲精品在线| 精品日本一线二线三线不卡| 日韩av在线免费观看不卡| 最新国产在线拍揄自揄视频| 久久久久久九九九九| 69成人精品免费视频| 久久动漫亚洲| 羞羞视频在线免费国产| 亚洲 国产 日韩 综合一区| 6080yy午夜一二三区久久| 国产美女诱惑一区二区| av免费在线免费| 亚洲午夜在线观看| 日韩精品福利在线| 成人免费黄色在线| 日韩精品中文字幕吗一区二区| 女人扒开屁股爽桶30分钟| 欧美华人在线视频| 一区二区三区日韩欧美| 外国成人激情视频| 免费看美女视频在线网站 | 亚洲情侣在线| 色哟哟免费在线观看 | 欧美激情久久久| 一区二区视频在线| 欧美日本在线| 欧美日韩色网| 手机福利在线视频| 大量国产精品视频| 亚洲人成精品久久久久久| 91亚洲国产成人久久精品| 欧美极品视频| a级片一区二区| 国内精品免费午夜毛片| 婷婷六月综合网| 葵司免费一区二区三区四区五区| 操人在线观看| 日韩av片网站| 成人av蜜桃| 亚洲欧美日韩中文在线| 国产精品无遮挡| 欧美午夜不卡| 欧美三级精品| 最新中文字幕av专区| 色一情一乱一伦一区二区三区丨 | 国产成人精品电影| 欧美三级中文字| 国产a级毛片一区| 成人影院中文字幕| 欧美日韩影视| cao在线观看| 91精品久久久久久久| 亚洲第一免费播放区| 欧美国产日本韩| 亚洲激情成人| 国产精品美女久久久久| 天天av综合网| 99久久国产综合精品五月天喷水| 国产精品久在线观看| 亚洲国产精品字幕| 亚洲午夜久久久久久久久久久| 日韩精彩视频在线观看| 高清精品xnxxcom| a视频在线免费看| 亚洲精品午夜在线观看| 欧美不卡1区2区3区| 欧美精品成人在线| 91麻豆精品91久久久久同性| 欧美激情一区二区三区全黄| 久久国产精品久久w女人spa| 国产精品流白浆在线观看| yellow在线观看网址| 三级视频网站在线| 午夜视频在线瓜伦| 性欧美大战久久久久久久免费观看|