人人都是架構(gòu)師:超6000萬(wàn)用戶!億級(jí)IM背后的技術(shù)架構(gòu)復(fù)雜度躍遷
億級(jí)用戶,架構(gòu)要解決的核心復(fù)雜度是什么?
在我們6000萬(wàn)用戶時(shí),我們面對(duì)的更多是“單點(diǎn)問(wèn)題”:某個(gè)服務(wù)掛了,數(shù)據(jù)庫(kù)連接數(shù)滿了,或者某個(gè)功能性能下降了。這些問(wèn)題相對(duì)獨(dú)立,可以用局部?jī)?yōu)化來(lái)解決。
但到了億級(jí)用戶,架構(gòu)的復(fù)雜度發(fā)生了根本性變化:
- 從單點(diǎn)到整體:任何一個(gè)模塊的微小波動(dòng),都可能因?yàn)楹A坑脩舳恢笖?shù)級(jí)放大,最終引發(fā)全局性的雪崩。
- 從技術(shù)到業(yè)務(wù):技術(shù)不再僅僅是滿足功能需求,而是要支撐業(yè)務(wù)的快速創(chuàng)新、生態(tài)的開(kāi)放,并直面成本控制這一核心命題。
從千萬(wàn)級(jí)用戶到億級(jí)用戶,架構(gòu)的演進(jìn)就像是下圖所示的架構(gòu)復(fù)雜度躍遷”。從快速驗(yàn)證(核心需求)到全面優(yōu)化(穩(wěn)定/開(kāi)放/成本)。
億級(jí)用戶規(guī)模下的總體架構(gòu)思路:分區(qū)架構(gòu)
當(dāng)用戶規(guī)模達(dá)到億級(jí),任何大而全的架構(gòu)模式都會(huì)成為瓶頸。我們的核心思想是“分區(qū)架構(gòu)”。
簡(jiǎn)單來(lái)說(shuō),就是將一個(gè)龐大的整體系統(tǒng),按一定規(guī)則拆分成多個(gè)獨(dú)立的子系統(tǒng)。每個(gè)子系統(tǒng)負(fù)責(zé)處理一部分用戶的數(shù)據(jù)和流量,且各分區(qū)之間互不影響。
這樣做的好處顯而易見(jiàn):
- 高可用:某個(gè)分區(qū)故障,只影響該分區(qū)內(nèi)的用戶,不影響整體服務(wù)。
- 高擴(kuò)展:當(dāng)用戶量繼續(xù)增長(zhǎng),只需增加新的分區(qū),實(shí)現(xiàn)線性擴(kuò)容。
- 低成本:可以對(duì)不同分區(qū)進(jìn)行差異化配置,例如新分區(qū)可以采用更經(jīng)濟(jì)的硬件。
從千萬(wàn)級(jí)到億級(jí),六大維度架構(gòu)演進(jìn)對(duì)比
要將分區(qū)架構(gòu)落地,需要從我們已有的千萬(wàn)級(jí)架構(gòu)中,進(jìn)行六個(gè)維度的深度演進(jìn)。下面,我將它們一一對(duì)比:
架構(gòu)維度 | 千萬(wàn)用戶(~6000萬(wàn)) | 億級(jí)用戶(1億+) | 演進(jìn)路徑 |
存儲(chǔ)架構(gòu) | MySQL主備、Redis集群 | 自研各類系統(tǒng)(分布式數(shù)據(jù)庫(kù)、KV存儲(chǔ)等) | 開(kāi)源/商業(yè) -> 自研 |
計(jì)算架構(gòu) | 2臺(tái) Nginx/LVS 負(fù)載均衡 | 分區(qū)架構(gòu)(多機(jī)房/分區(qū)) | 多機(jī)房 -> 分區(qū) |
可擴(kuò)展架構(gòu) | 拆分為5個(gè)服務(wù)、微服務(wù) | 業(yè)務(wù)線(BU -> BG) | 業(yè)務(wù)域 -> 業(yè)務(wù)線 |
高可用 | 同城雙中心 | 異地多活/分區(qū)架構(gòu) | 雙活 -> 分區(qū) |
大數(shù)據(jù)架構(gòu) | ClickHouse | 自研或者創(chuàng)新各類系統(tǒng) | 開(kāi)源/商業(yè) -> 自研 |
成本/開(kāi)放 | 不涉及 | 開(kāi)放平臺(tái) + 降成本 | 封閉 -> 開(kāi)放/降成本 |
1. 存儲(chǔ)架構(gòu):從集群到自研
千萬(wàn)用戶時(shí),我們使用成熟的MySQL 主備 + Redis 集群,足以應(yīng)對(duì)大部分讀寫(xiě)需求。但當(dāng)數(shù)據(jù)量達(dá)到億級(jí),單機(jī)的數(shù)據(jù)庫(kù)瓶頸會(huì)暴露無(wú)遺。
億級(jí)用戶的解決方案是自研各類存儲(chǔ)系統(tǒng),如分布式關(guān)系型數(shù)據(jù)庫(kù)、高性能 KV 存儲(chǔ)等。這不僅能提供更強(qiáng)的擴(kuò)展性和性能,還能根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行深度優(yōu)化,例如為IM業(yè)務(wù)定制化存儲(chǔ)消息的格式和索引。
2. 計(jì)算架構(gòu):從多機(jī)房到分區(qū)
千萬(wàn)用戶時(shí),我們通過(guò)F5 + 多機(jī)房的方式來(lái)解決高可用問(wèn)題。
億級(jí)用戶則必須演進(jìn)到分區(qū)架構(gòu)。例如,我們將用戶ID按哈希規(guī)則分成10個(gè)分區(qū),每個(gè)分區(qū)都擁有完整的服務(wù)和存儲(chǔ)集群,部署在獨(dú)立的機(jī)房或集群中。這樣,即便某個(gè)分區(qū)發(fā)生重大故障,也只會(huì)影響該分區(qū)內(nèi)的10%用戶。
3. 可擴(kuò)展架構(gòu):從業(yè)務(wù)域到業(yè)務(wù)線
起初,我們按業(yè)務(wù)域?qū)M業(yè)務(wù)拆分為5個(gè)服務(wù)。但隨著業(yè)務(wù)團(tuán)隊(duì)增長(zhǎng)到上千人,這種拆分方式顯得力不從心。
億級(jí)用戶需要將架構(gòu)按業(yè)務(wù)線(BU/BG)劃分。例如,將IM業(yè)務(wù)拆分為to B業(yè)務(wù)線、to C業(yè)務(wù)線等。每個(gè)業(yè)務(wù)線擁有自己的技術(shù)團(tuán)隊(duì)和獨(dú)立的架構(gòu),最大限度地解耦和提升迭代效率。
4. 高可用:從同城雙活到異地多活/分區(qū)
千萬(wàn)用戶時(shí),我們用同城雙中心來(lái)保障數(shù)據(jù)不丟失,服務(wù)不中斷。
但到了億級(jí)用戶,必須升級(jí)到異地多活,以應(yīng)對(duì)城市級(jí)別的災(zāi)難。我們甚至更進(jìn)一步,利用分區(qū)架構(gòu)實(shí)現(xiàn)分區(qū)多活,使得每個(gè)分區(qū)都可以獨(dú)立運(yùn)行,互不干擾,將高可用的粒度細(xì)化到極致。
5. 開(kāi)放與降成本:兩個(gè)核心命題
隨著公司的壯大,外部合作的意愿越來(lái)越強(qiáng),而老板對(duì)成本的關(guān)注也與日俱增。
億級(jí)用戶架構(gòu)必須解決這兩個(gè)核心問(wèn)題。
開(kāi)放平臺(tái)架構(gòu)設(shè)計(jì):
我們的開(kāi)放平臺(tái)采取了“沙箱環(huán)境”和“管理后臺(tái)”的設(shè)計(jì)原則,保障線上數(shù)據(jù)的安全。
- 沙箱環(huán)境:供第三方應(yīng)用測(cè)試,與線上數(shù)據(jù)完全隔離。
- 管理后臺(tái):負(fù)責(zé)第三方應(yīng)用的審核、上架、下架等管理。
- 數(shù)據(jù)分析:提供第三方應(yīng)用的統(tǒng)計(jì)分析,如安裝量、活躍數(shù),幫助開(kāi)發(fā)者和我們進(jìn)行數(shù)據(jù)化運(yùn)營(yíng)。
降成本設(shè)計(jì):
我們從三個(gè)層面系統(tǒng)性地解決成本問(wèn)題:
- 調(diào)優(yōu):針對(duì)億級(jí)流量的業(yè)務(wù)場(chǎng)景,深度優(yōu)化 Linux、數(shù)據(jù)庫(kù)、JVM 等參數(shù),提升資源利用率。
- 定制化:采購(gòu)定制化的硬件服務(wù)器、定制化 Linux 內(nèi)核和 JVM,以獲取更高的性能和更低的能耗。
- 自建系統(tǒng):用自研系統(tǒng)(如分布式存儲(chǔ)、計(jì)算引擎)代替昂貴的開(kāi)源或商業(yè)系統(tǒng),從根本上降低成本。例如,去 IOE(去 IBM、Oracle、 EMC)是一種常見(jiàn)的自建策略。
總結(jié):億級(jí)用戶,架構(gòu)是持續(xù)優(yōu)化的藝術(shù)
從千萬(wàn)到億,我們的技術(shù)架構(gòu)經(jīng)歷了深刻的變革。這不僅僅是技術(shù)選型的簡(jiǎn)單升級(jí),更是對(duì)架構(gòu)理念的重新思考。
我們不再追求大而全,而是走向精細(xì)化、分區(qū)化和開(kāi)放化。這是一條沒(méi)有終點(diǎn)的旅程,億級(jí)用戶架構(gòu)的核心復(fù)雜度,在于平衡——在穩(wěn)定性、可擴(kuò)展性、開(kāi)放性和成本之間找到最優(yōu)解。
下一個(gè)億級(jí)用戶,我們準(zhǔn)備好了。你呢?





























