你知道12306 是如何支撐百萬 QPS 的?寫得太好了!
阿新 • • 發佈:2021-11-08
*作者:*繪你一世傾城**
出處:juejin.im/post/5d84e21f6fb9a06ac8248149
12306 搶票,極限併發帶來的思考
雖然現在大多數情況下都能訂到票,但是放票瞬間即無票的場景,相信大家都深有體會。
尤其是春節期間,大家不僅使用 12306,還會考慮“智行”和其他的搶票軟體,全國上下幾億人在這段時間都在搶票。
“12306 服務”承受著這個世界上任何秒殺系統都無法超越的 QPS,上百萬的併發再正常不過了!
筆者專門研究了一下“12306”的服務端架構,學習到了其系統設計上很多亮點,在這裡和大家分享一下並模擬一個例子:如何在 100 萬人同時搶 1 萬張火車票時,系統提供正常、穩定的服務。
Github程式碼地址:
https://github.com/GuoZhaoran/spikeSystem
大型高併發系統架構
高併發的系統架構都會採用分散式叢集部署,服務上層有著層層負載均衡,並提供各種容災手段(雙火機房、節點容錯、伺服器災備等)保證系統的高可用,流量也會根據不同的負載能力和配置策略均衡到不同的伺服器上。
下邊是一個簡單的示意圖:
** **
負載均衡簡介
上圖中描述了使用者請求到伺服器經歷了三層的負載均衡,下邊分別簡單介紹一下這三種負載均衡。
①OSPF(開放式最短鏈路優先)是一個內部閘道器協議(Interior Gateway Protocol,簡稱 IGP)
OSPF 通過路由器之間通告網路介面的狀態來建立鏈路狀態資料庫,生成最短路徑樹,OSPF 會自動計算路由介面上的 Cost 值,但也可以通過手工指定該介面的 Cost 值,手工指定的優先於自動計算的值。
OSPF 計算的 Cost,同樣是和介面頻寬成反比,頻寬越高,Cost 值越小。到達目標相同 Cost 值的路徑,可以執行負載均衡,最多 6 條鏈路同時執行負載均衡。
②LVS (Linux Virtual Server)
它是一種叢集(Cluster)技術,採用 IP 負載均衡技術和基於內容請求分發技術。
排程器具有很好的吞吐率,將請求均衡地轉移到不同的伺服器上執行,且排程器自動遮蔽掉伺服器的故障,從而將一組伺服器構成一個高效能的、高可用的虛擬伺服器。
③Nginx
想必大家都很熟悉了,是一款非常高效能的 HTTP 代理/反向代理伺服器,服務開發中也經常使用它來做負載均衡。
Nginx 實現負載均衡的方式主要有三種:
- 輪詢
- 加權輪詢
- IP Hash 輪詢
- 在極限併發情況下,任何一個記憶體操作的細節都至關影響效能,尤其像建立訂單這種邏輯,一般都需要儲存到磁碟資料庫的,對資料庫的壓力是可想而知的。
- 如果使用者存在惡意下單的情況,只下單不支付這樣庫存就會變少,會少賣很多訂單,雖然服務端可以限制 IP 和使用者的購買訂單數量,這也不算是一個好方法。