昨晚你的微信朋友圈,是不是也被 "尤物" "嗎喽" "憤世者" 刷屏了?
4 月 9 日晚,一個叫 SBTI 的人格測試突然在社群網路上爆紅。用戶蜂擁而至,網站直接崩潰——頁面打不開、連結失效,大家只能靠截圖「雲測試」。作者深夜緊急發佈新連結,稱「做了略微修改,應該不會再崩了」。
作為一個技術人,看到「網站崩了」和「略微修改就不崩了」這兩句話,我的職業病就犯了。今天我們不聊測試準不準,只聊:這背後到底發生了什麼?如果是你來做,怎麼才能扛住這波流量?
SBTI 測試的崩潰,是教科書等級的 Thundering Herd(雷群效應)案例。
簡單說就是:一個原本只為「勸朋友戒酒」而做的小專案,突然被幾百萬人同時訪問。這就好比你開了一家只有兩張桌子的麵館,突然被美食部落客推薦,門口排了兩公里的隊伍。
根據公開資訊推測,SBTI 最初大概率是以下這種架構:
使用者瀏覽器 → 單台伺服器(前端 + 後端 + 資料庫 all-in-one)
這種架構在日常幾百、幾千 PV 的場景下完全夠用。但當朋友圈裂變式傳播啟動後,並發量可能在幾分鐘內從個位數飆升到數萬甚至數十萬級別。單機扛不住,結果就是:
作者說「做了略微修改,應該不會再崩了」。這句話資訊量很大。
對於一個測試類 H5 應用,最高效的「略微修改」大概率是以下幾種操作之一(或組合):
測試類應用的核心邏輯其實很簡單:顯示題目 → 使用者選擇 → 前端計算結果 → 顯示結果頁。整個流程完全可以在瀏覽器端完成,不需要後端伺服器參與。
之前:使用者 → 源站伺服器(動態渲染)
之後:使用者 → CDN 邊緣節點(靜態資源)→ 前端 JS 本地計算結果
把所有頁面打包成純靜態檔(HTML + CSS + JS + 圖片),丟到 CDN 上。CDN 在全國有數百個邊緣節點,使用者存取時會自動路由到最近的節點。這樣源站壓力幾乎為零,理論上可以承載千萬級並發。
從自建伺服器遷移到 Vercel、Cloudflare Pages、Netlify 等現代靜態託管平台。這些平台天生具備全球 CDN 分發能力,部署一個靜態網站只需要幾分鐘。
如果測試邏輯中確實有需要後端參與的部分(比如 AI 生成結果文案),可以將後端邏輯遷移到 Serverless 函數(如 AWS Lambda、阿里雲函數計算)。Serverless 的核心優勢是自動彈性伸縮——流量來了自動擴容,流量走了自動縮容,按實際調用次數計費。
假設你現在要做一個類似 SBTI 的病毒式傳播測試應用,並且預期它可能會爆紅,建議的架構如下:
┌─────────────────────────────────────────────────┐
│ 使用者瀏覽器 │
│ ┌───────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ 答題引擎 │ │ 計分邏輯 │ │ 結果圖片生成 │ │
│ │ (純前端) │ │ (純前端) │ │ (Canvas/SVG) │ │
│ └───────────┘ └──────────┘ └───────────────┘ │
└──────────────────────┬──────────────────────────┘
│ 靜態資源請求
▼
┌─────────────────┐
│ CDN 邊緣節點 │
│ (全國 300+ 節點)│
└────────┬────────┘
│ 回源(極少觸發)
▼
┌─────────────────┐
│ 物件儲存(OSS) │
│ HTML/CSS/JS/圖片 │
└─────────────────┘
核心設計原則:
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' // 高辨識度的分享縮圖
})
關鍵技術點:
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 萬人生成分享圖,伺服器也毫無壓力。
根據公開資訊,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 資源:
一個純靜態的測試應用,即使面對百萬級流量,CDN 方案的成本也就是一頓火鍋錢。而如果用單機硬扛,伺服器費用可能不高,但使用者體驗的損失是無法估量的——多少潛在的傳播鏈路因為「頁面打不開」而斷裂了。
SBTI 事件給我們的啟示:
一個為勸朋友戒酒而生的測試,意外成為了一堂生動的高併發架構課。技術世界的浪漫,大概就是這樣吧。
文中技術分析基於公開資訊推測,不代表 SBTI 實際技術實作。
如果你也在職場摸索成長路線,想了解更多內部跳槽、團隊優化、技術實踐和職場認知升級的經驗,可以關注我的公眾號: 碼農職場
後續我會分享更多乾貨,幫助你在職場和技術上持續突破。