SBTI 測試擠崩伺服器:一個程式設計師視角的技術復盤

昨晚你的微信朋友圈,是不是也被 "尤物" "嗎喽" "憤世者" 刷屏了?

4 月 9 日晚,一個叫 SBTI 的人格測試突然在社群網路上爆紅。用戶蜂擁而至,網站直接崩潰——頁面打不開、連結失效,大家只能靠截圖「雲測試」。作者深夜緊急發佈新連結,稱「做了略微修改,應該不會再崩了」。

作為一個技術人,看到「網站崩了」和「略微修改就不崩了」這兩句話,我的職業病就犯了。今天我們不聊測試準不準,只聊:這背後到底發生了什麼?如果是你來做,怎麼才能扛住這波流量?

一、崩潰現場還原:一個經典的「雷群效應」

SBTI 測試的崩潰,是教科書等級的 Thundering Herd(雷群效應)案例。

簡單說就是:一個原本只為「勸朋友戒酒」而做的小專案,突然被幾百萬人同時訪問。這就好比你開了一家只有兩張桌子的麵館,突然被美食部落客推薦,門口排了兩公里的隊伍。

根據公開資訊推測,SBTI 最初大概率是以下這種架構:

使用者瀏覽器 → 單台伺服器(前端 + 後端 + 資料庫 all-in-one)

這種架構在日常幾百、幾千 PV 的場景下完全夠用。但當朋友圈裂變式傳播啟動後,並發量可能在幾分鐘內從個位數飆升到數萬甚至數十萬級別。單機扛不住,結果就是:

  • 連線池耗盡:伺服器能同時處理的請求數是有限的,超出後新請求直接被拒絕
  • 頻寬被打滿:測試頁面包含圖片、樣式、腳本,每個使用者載入一次就消耗幾百 KB 到幾 MB 的頻寬
  • 如果有後端邏輯:資料庫連線數爆滿、CPU 被打滿,回應時間從毫秒級飆升到逾時

二、「略微修改」背後的技術真相

作者說「做了略微修改,應該不會再崩了」。這句話資訊量很大。

對於一個測試類 H5 應用,最高效的「略微修改」大概率是以下幾種操作之一(或組合):

方案 A:純靜態化 + CDN 分發

測試類應用的核心邏輯其實很簡單:顯示題目 → 使用者選擇 → 前端計算結果 → 顯示結果頁。整個流程完全可以在瀏覽器端完成,不需要後端伺服器參與。

之前:使用者 → 源站伺服器(動態渲染)
之後:使用者 → CDN 邊緣節點(靜態資源)→ 前端 JS 本地計算結果

把所有頁面打包成純靜態檔(HTML + CSS + JS + 圖片),丟到 CDN 上。CDN 在全國有數百個邊緣節點,使用者存取時會自動路由到最近的節點。這樣源站壓力幾乎為零,理論上可以承載千萬級並發。

方案 B:更換託管平台

從自建伺服器遷移到 Vercel、Cloudflare Pages、Netlify 等現代靜態託管平台。這些平台天生具備全球 CDN 分發能力,部署一個靜態網站只需要幾分鐘。

方案 C:Serverless 化

如果測試邏輯中確實有需要後端參與的部分(比如 AI 生成結果文案),可以將後端邏輯遷移到 Serverless 函數(如 AWS Lambda、阿里雲函數計算)。Serverless 的核心優勢是自動彈性伸縮——流量來了自動擴容,流量走了自動縮容,按實際調用次數計費。

三、如果讓你從零設計,架構應該長什麼樣?

假設你現在要做一個類似 SBTI 的病毒式傳播測試應用,並且預期它可能會爆紅,建議的架構如下:

┌─────────────────────────────────────────────────┐
│                    使用者瀏覽器                    │
│  ┌───────────┐  ┌──────────┐  ┌───────────────┐  │
│  │ 答題引擎   │  │ 計分邏輯  │  │ 結果圖片生成   │  │
│  │ (純前端)   │  │ (純前端)  │  │ (Canvas/SVG)  │  │
│  └───────────┘  └──────────┘  └───────────────┘  │
└──────────────────────┬──────────────────────────┘
                       │ 靜態資源請求
                       ▼
              ┌─────────────────┐
              │   CDN 邊緣節點    │
              │  (全國 300+ 節點)│
              └────────┬────────┘
                       │ 回源(極少觸發)
                       ▼
              ┌─────────────────┐
              │  物件儲存(OSS)  │
              │  HTML/CSS/JS/圖片 │
              └─────────────────┘

核心設計原則:

  1. 計算下沉到客戶端:題目資料、計分邏輯、結果映射全部內嵌在前端程式碼中,瀏覽器本地完成所有計算,伺服器零壓力
  2. 資源全量 CDN 化:所有靜態資源透過 CDN 分發,用戶就近存取,首屏載入時間控制在 1–2 秒內
  3. 結果圖片由用戶端生成:使用 Canvas API 或 html2canvas 在使用者瀏覽器中直接生成分享圖片,避免伺服器圖片渲染的效能瓶頸
  4. 零後端依賴:整個應用不需要資料庫、不需要後端 API,運維成本趨近於零

四、病毒傳播的技術引擎:分享鏈路優化

SBTI 能刷屏朋友圈,除了內容本身的娛樂性,分享鏈路的技術設計也至關重要。

微信分享卡片優化

// 微信 JS-SDK 分享設定
wx.updateAppMessageShareData({
  title: '我的 SBTI 人格是【尤物】,你是什麼?', // 動態標題,包含測試結果
  desc: 'MBTI 已經過時了,來測測你的 SBTI 人格吧',
  link: 'https://example.com/sbti?from=share',   // 帶來源追蹤參數
  imgUrl: 'https://cdn.example.com/sbti-share.jpg' // 高辨識度的分享縮圖
})

關鍵技術點:

  • 動態分享標題:將使用者的測試結果嵌入分享標題,製造好奇心驅動的點擊慾望
  • 結果圖片生成:用 Canvas 將測試結果渲染為一張精美圖片,方便使用者保存並發到朋友圈
  • 短連結 + UTM 追蹤:透過 URL 參數追蹤傳播路徑,了解哪個管道帶來的流量最大

分享圖片的客戶端生成方案

import html2canvas from 'html2canvas';

async function generateShareImage(resultElement) {
  const canvas = await html2canvas(resultElement, {
    scale: 2,              // 2 倍解析度,保證清晰度
    useCORS: true,         // 允許跨域圖片
    backgroundColor: null  // 透明背景
  });

  // 轉為圖片供使用者長按保存
  const imgUrl = canvas.toDataURL('image/png');
  return imgUrl;
}

這個方案的好處是:圖片在使用者手機上生成,不需要伺服器端渲染,即使同時有 100 萬人生成分享圖,伺服器也毫無壓力。

五、AI 在其中扮演的角色

根據公開資訊,SBTI 的人格描述內容使用了 AI 生成技術。這帶來了一個有趣的架構選擇:

方案一:預先生成(推薦)

在開發階段就用 AI 生成好所有人格類型的描述文案,作為靜態資料打包到前端程式碼中。執行時不需要呼叫 AI 介面,零延遲、零成本。

// 預先生成的結果資料,直接內嵌在前端程式碼中
const SBTI_RESULTS = {
  'ABCD': {
    title: '尤物',
    description: 'AI 生成的人格描述文案...',
    image: '/assets/results/abcd.png'
  },
  'EFGH': {
    title: '嗎喽',
    description: 'AI 生成的人格描述文案...',
    image: '/assets/results/efgh.png'
  }
  // ... 其他類型
}

方案二:即時生成(不建議用於病毒傳播場景)

每次使用者完成測試後即時呼叫 AI API 生成個性化描述。這種方案在流量暴增時會面臨:API 呼叫成本飆升、回應延遲增大、API 限流等問題。

從 SBTI 的實際表現來看(崩潰後「略微修改」就恢復了),大概率採用的是方案一——AI 只在開發階段參與內容生產,執行時是純靜態應用。

六、成本算一筆帳

假設 SBTI 在爆紅期間有 500 萬次訪問,每次訪問載入約 2MB 資源:

  • 單台雲伺服器(2 核 4G)¥100/月,但會崩 ❌
  • CDN + 物件儲存流量費約 ¥500–1000 ✅
  • Vercel/Cloudflare Pages 免費版 ¥0(有頻寬限制)⚠️
  • Vercel Pro + CDN ¥150/月 ✅

一個純靜態的測試應用,即使面對百萬級流量,CDN 方案的成本也就是一頓火鍋錢。而如果用單機硬扛,伺服器費用可能不高,但使用者體驗的損失是無法估量的——多少潛在的傳播鏈路因為「頁面打不開」而斷裂了。

七、給開發者的 Takeaway

SBTI 事件給我們的啟示:

  1. 永遠為最壞的情況做準備:如果你的產品有社交傳播屬性,請在架構設計時就考慮流量暴增的場景。CDN + 靜態化的成本幾乎為零,但收益巨大。
  2. 能在前端做的事,別放到後端:測試類應用的計算邏輯完全可以在瀏覽器端完成。每減少一次伺服器請求,就多了一份穩定性。
  3. 分享體驗就是成長引擎:結果圖片的生成品質、分享卡片的文案設計,直接決定了傳播係數。技術上要保證分享鏈路的順暢性。
  4. AI 是內容生產工具,不是執行時依賴:對於這類應用,AI 最適合在開發階段批量生成內容,而不是在執行時即時呼叫。
  5. 小專案也值得好架構:SBTI 的作者最初只是想勸朋友戒酒,沒想到會火。但如果一開始就用靜態託管方案,根本不會有崩潰這回事。好的架構不一定複雜,但一定要匹配場景。

一個為勸朋友戒酒而生的測試,意外成為了一堂生動的高併發架構課。技術世界的浪漫,大概就是這樣吧。


八、最後

文中技術分析基於公開資訊推測,不代表 SBTI 實際技術實作。
如果你也在職場摸索成長路線,想了解更多內部跳槽、團隊優化、技術實踐和職場認知升級的經驗,可以關注我的公眾號: 碼農職場
後續我會分享更多乾貨,幫助你在職場和技術上持續突破。


原文出處:https://juejin.cn/post/7626798165396553766


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝5   💬6   ❤️3
425
🥈
我愛JS
📝2   💬7   ❤️2
206
🥉
💬1  
4
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登