天天看點

每天數十億次請求的應用經驗分享,值得參考!

印度最大電商公司Snapdeal介紹了其Snapdeal Ads系統支援每天5B請求的經驗分享。

對于隻有不到10個工程師的團隊建構一個可伸縮的大型Web系統(web-scale)是困難的,使用正确的技術也許比你的團隊成員數量多少更加重要。

關鍵戰略:

1. 從水準和垂直兩個方面擴充

2.CAP定理中選擇可用性和分區容錯性(AP),而不是一緻性和可用性組合(CA)。因為初始目标是需要一個低延遲 高性能的拍賣服務平台。

3.沒有廠商鎖定保護或因為專利限制使用的情況,開源軟體以前達到毫無疑問的穩定和易用程度,且低費用。是以決定不再使用軟體供應廠商的專有軟體。

4.基于機器同情Mechanical Sympathy法則建立系統,軟體建立在深刻了解硬體工作機理上,通過軟體最大發揮硬體潛能。

5.雲技術的限制使用,因為亞馬遜EC2比較昂貴,其次是網絡不确定和磁盤虛拟化會提高延遲時間。

6.如果延遲存在就必須處理它,再試圖消除它,所有的查詢應該限制在1ms以下,使用RocksDB和各種其他解決方案作為初始緩存/嵌入式資料庫。

7.盡可能使用SSD,也是為了降低延遲。

8.不虛拟化硬體,利用大規模硬體優點(256GB RAM, 24 core)并行化很多計算。

9.磁盤寫操作,如果可能進行計時然後每隔幾秒将一串資料flush寫到到磁盤。

10.Nginx微調到支援keep-alive連接配接,Netty優化到支援大量并發負載支援模型。

11.關鍵資料對于廣告伺服器總是立即可用(微妙級),所有資料都是存儲在記憶體in-memory的庫或資料結構中。

12.架構應該總是share nothing,至少廣告伺服器和外部拍賣系統應該是share nothing,當我們拔掉廣告伺服器時,整個系統都不會眨眼受到影響。

13.所有關鍵資料結果必須是可複制的。

14.保持幾天的原始記錄備份。

15.如果資料有點過時和系統不一緻,沒有關系。

16.消息系統應該是失敗容錯,可以崩潰但是不能丢失資料。

目前基礎設施:

1.跨3個資料中心的40–50節點。

2.其中是30台用于高計算(128–256G RAM, 24 cores, 目前頂級CPU,盡可能SSD)

3.其餘小于32G RAM, Quadcore機器.

4.10G私有網絡 + 10G 公共網絡

5.小型 Cassandra, Hbase 和 Spark 叢集.

關鍵性需求:

1.系統支援多個拍賣者發送基于HTTP(REST端口)的RTB 2.0請求。

2.系統應當能在拍賣中推出Yes/No 價格與廣告的響應。

3.系統應當能處理每天數億的事件,響應幾百上千的QPS。

4.資料應該盡可能被處理,至少關鍵點是這樣。

使用的關鍵技術:

1.HBase和Cassandra用于計資料和和管理使用者或賬戶的傳統資料集,選擇HBase是因為高寫入性能,能夠幾乎實時處理計數。

2.後端主要語言是Java,盡管過去有C++和Erlang經驗,Java有成熟的應用技能,JVM也相當成熟。

3.Google Protobuf 用于資料傳輸

4.Netty作為後端主要伺服器,簡單高性能。

5.RocksDB作為使用者資料讀寫服務,它是嵌入式資料庫,使用Apache Kafka能夠跨RocksDB同步資料。

6.Kafka是用于消息隊列,流化資料處理

7.CQEngine用于主要的記憶體in-memory快速查詢。

8.Nginx是主要的反向代理

9.Apache Spark是使用者ML處理

10 Jenkins用于CI

11.Nagio和Newrelic 監視伺服器

12.Zookeeper用于分布式同步

13.Dozens of third parties for audience segments, etc.

14.Bittorrent Sync用于同步跨節點和資料中心的關鍵資料

15.ustom built quota manger based on Yahoo white paper for budget control.

系統設計與結果:

ad伺服器是使用簡單非堵塞的netty建構,處理每個進來的HTTP請求,在記憶體的很多存儲中尋找一個活動進行展示,這是使用CQ Engine查詢,這種查詢并不引發任何網絡延遲,計算時間或堵塞過程比如磁盤寫,将會整個在記憶體中運作,所有計算會發生在節點記憶體中,幾乎是in process。

ad伺服器和其他系統沒有分享,共同元件是通過異步通訊。

ad伺服器以5-15ms延遲的高性能傳遞結果,原始資料異步寫入到Kafka處理。

原始資料被Hbase中多個Java過程消費,預算和活動狀态在Cassandra叢集中更新。

一些原始資料發往spark叢集用于adhoc處理。