每天数十亿次请求的应用经验分享,值得参考!
來(lái)源:https://www.jdon.com/47776
印度最大電商公司Snapdeal介紹了其Snapdeal Ads系統(tǒng)支持每天5B請(qǐng)求的經(jīng)驗(yàn)分享。
對(duì)于只有不到10個(gè)工程師的團(tuán)隊(duì)構(gòu)建一個(gè)可伸縮的大型Web系統(tǒng)(web-scale)是困難的,使用正確的技術(shù)也許比你的團(tuán)隊(duì)成員數(shù)量多少更加重要。
關(guān)鍵戰(zhàn)略:
1. 從水平和垂直兩個(gè)方面擴(kuò)展
2.CAP定理中選擇可用性和分區(qū)容錯(cuò)性(AP),而不是一致性和可用性組合(CA)。因?yàn)槌跏寄繕?biāo)是需要一個(gè)低延遲 高性能的拍賣服務(wù)平臺(tái)。
3.沒(méi)有廠商鎖定保護(hù)或因?yàn)閷@拗剖褂玫那闆r,開(kāi)源軟件以前達(dá)到毫無(wú)疑問(wèn)的穩(wěn)定和易用程度,且低費(fèi)用。因此決定不再使用軟件供應(yīng)廠商的專有軟件。
4.基于機(jī)器同情Mechanical Sympathy法則建立系統(tǒng),軟件建立在深刻理解硬件工作機(jī)理上,通過(guò)軟件最大發(fā)揮硬件潛能。
5.云技術(shù)的限制使用,因?yàn)閬嗰R遜EC2比較昂貴,其次是網(wǎng)絡(luò)不確定和磁盤虛擬化會(huì)提高延遲時(shí)間。
6.如果延遲存在就必須處理它,再試圖消除它,所有的查詢應(yīng)該限制在1ms以下,使用RocksDB和各種其他解決方案作為初始緩存/嵌入式數(shù)據(jù)庫(kù)。
7.盡可能使用SSD,也是為了降低延遲。
8.不虛擬化硬件,利用大規(guī)模硬件優(yōu)點(diǎn)(256GB RAM, 24 core)并行化很多計(jì)算。
9.磁盤寫操作,如果可能進(jìn)行計(jì)時(shí)然后每隔幾秒將一串?dāng)?shù)據(jù)flush寫到到磁盤。
10.Nginx微調(diào)到支持keep-alive連接,Netty優(yōu)化到支持大量并發(fā)負(fù)載支持模型。
11.關(guān)鍵數(shù)據(jù)對(duì)于廣告服務(wù)器總是立即可用(微妙級(jí)),所有數(shù)據(jù)都是存儲(chǔ)在內(nèi)存in-memory的庫(kù)或數(shù)據(jù)結(jié)構(gòu)中。
12.架構(gòu)應(yīng)該總是share nothing,至少?gòu)V告服務(wù)器和外部拍賣系統(tǒng)應(yīng)該是share nothing,當(dāng)我們拔掉廣告服務(wù)器時(shí),整個(gè)系統(tǒng)都不會(huì)眨眼受到影響。
13.所有關(guān)鍵數(shù)據(jù)結(jié)果必須是可復(fù)制的。
14.保持幾天的原始記錄備份。
15.如果數(shù)據(jù)有點(diǎn)過(guò)時(shí)和系統(tǒng)不一致,沒(méi)有關(guān)系。
16.消息系統(tǒng)應(yīng)該是失敗容錯(cuò),可以崩潰但是不能丟失數(shù)據(jù)。
當(dāng)前基礎(chǔ)設(shè)施:
1.跨3個(gè)數(shù)據(jù)中心的40–50節(jié)點(diǎn)。
2.其中是30臺(tái)用于高計(jì)算(128–256G RAM, 24 cores, 當(dāng)前頂級(jí)CPU,盡可能SSD)
3.其余小于32G RAM, Quadcore機(jī)器.
4.10G私有網(wǎng)絡(luò) + 10G 公共網(wǎng)絡(luò)
5.小型 Cassandra, Hbase 和 Spark 集群.
關(guān)鍵性需求:
1.系統(tǒng)支持多個(gè)拍賣者發(fā)送基于HTTP(REST端口)的RTB 2.0請(qǐng)求。
2.系統(tǒng)應(yīng)當(dāng)能在拍賣中推出Yes/No 價(jià)格與廣告的響應(yīng)。
3.系統(tǒng)應(yīng)當(dāng)能處理每天數(shù)億的事件,響應(yīng)幾百上千的QPS。
4.數(shù)據(jù)應(yīng)該盡可能被處理,至少關(guān)鍵點(diǎn)是這樣。
使用的關(guān)鍵技術(shù):
1.HBase和Cassandra用于計(jì)數(shù)據(jù)和和管理用戶或賬戶的傳統(tǒng)數(shù)據(jù)集,選擇HBase是因?yàn)楦邔懭胄阅?#xff0c;能夠幾乎實(shí)時(shí)處理計(jì)數(shù)。
2.后端主要語(yǔ)言是Java,盡管過(guò)去有C++和Erlang經(jīng)驗(yàn),Java有成熟的應(yīng)用技能,JVM也相當(dāng)成熟。
3.Google Protobuf 用于數(shù)據(jù)傳輸
4.Netty作為后端主要服務(wù)器,簡(jiǎn)單高性能。
5.RocksDB作為用戶資料讀寫服務(wù),它是嵌入式數(shù)據(jù)庫(kù),使用Apache Kafka能夠跨RocksDB同步數(shù)據(jù)。
6.Kafka是用于消息隊(duì)列,流化數(shù)據(jù)處理
7.CQEngine用于主要的內(nèi)存in-memory快速查詢。
8.Nginx是主要的反向代理
9.Apache Spark是用戶ML處理
10 Jenkins用于CI
11.Nagio和Newrelic 監(jiān)視服務(wù)器
12.Zookeeper用于分布式同步
13.Dozens of third parties for audience segments, etc.
14.Bittorrent Sync用于同步跨節(jié)點(diǎn)和數(shù)據(jù)中心的關(guān)鍵數(shù)據(jù)
15.ustom built quota manger based on Yahoo white paper for budget control.
系統(tǒng)設(shè)計(jì)與結(jié)果:
ad服務(wù)器是使用簡(jiǎn)單非堵塞的netty構(gòu)建,處理每個(gè)進(jìn)來(lái)的HTTP請(qǐng)求,在內(nèi)存的很多存儲(chǔ)中尋找一個(gè)活動(dòng)進(jìn)行展示,這是使用CQ Engine查詢,這種查詢并不引發(fā)任何網(wǎng)絡(luò)延遲,計(jì)算時(shí)間或堵塞過(guò)程比如磁盤寫,將會(huì)整個(gè)在內(nèi)存中運(yùn)行,所有計(jì)算會(huì)發(fā)生在節(jié)點(diǎn)內(nèi)存中,幾乎是in process。
ad服務(wù)器和其他系統(tǒng)沒(méi)有分享,共同組件是通過(guò)異步通訊。
ad服務(wù)器以5-15ms延遲的高性能傳遞結(jié)果,原始數(shù)據(jù)異步寫入到Kafka處理。
原始數(shù)據(jù)被Hbase中多個(gè)Java過(guò)程消費(fèi),預(yù)算和活動(dòng)狀態(tài)在Cassandra集群中更新。
一些原始數(shù)據(jù)發(fā)往spark集群用于adhoc處理。
總結(jié)
以上是生活随笔為你收集整理的每天数十亿次请求的应用经验分享,值得参考!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员的精力呵护指南!来自十年程序员的精
- 下一篇: 用户在电商网站中购买成功了,那么 TA