當前位置: 妍妍網 > 碼農

16k Star! 輕松拿個offer,12306鐵路訂票系統

2024-05-07碼農

計畫描述

什麽是12306?

12306 鐵路購票服務是與大家生活和出行相關的關鍵系統,包括會員、購票、訂單、支付和閘道器等服務。

這個計畫旨在讓學習者可以快速掌握分布式系統設計的技巧,尤其適合對高並行、分布式感興趣的同學學習。如果想深入理解和套用分布式系統的設計原則,這個計畫將會是一個很好的學習資源。

12306 計畫中包含了緩存、訊息佇列、分庫分表、設計模式等程式碼,透過這些程式碼可以全面了解分布式系統的核心知識點。

為了方便大家學習,該系統提供了兩種版本:

  • SpringBoot 聚合服務版本:適合測試和部署,可以直接啟動 aggregation-service 聚合服務和閘道器服務。

  • SpringCloud 微服務版本:適合學習微服務設計,可以分別啟動支付、訂單、使用者、購票和閘道器服務。

  • 根據自己的學習和使用需求,選擇合適的版本啟動即可。微服務版本側重學習設計,聚合服務版本側重測試和部署。請根據場景需要,選擇正確的版本進行學習和使用。

    技術架構

    在系統設計中,采用最新 JDK17 + SpringBoot3&SpringCloud 微服務架構,構建高並行、大數據量下仍然能提供高效可靠的 12306 購票服務。

    透過學習 12306 計畫,不僅能了解其運作機制,還能接觸最新技術體系帶來的新特性,從而拓展技術視野並提升自身技術水平。

    下方的架構圖全面描述了計畫的服務集合、元件庫列表和基礎設定層等要素,有助於使用者快速了解 12306 平台的頂層設計和業務細節,從零到一進行構建。

    計畫品質怎麽樣?

    我理解大家對選擇一個合適的計畫以投入時間和精力的擔憂。選對計畫既可以鍛煉技能,又可以產出價值是非常重要的。

    以使用者服務系統為例,低並行和低數據量的系統相對簡單,但高並行和海量數據的系統則需要考慮很多額外因素。

    1. 當使用者在 12306 網站註冊新帳號或添加乘車人時,系統需驗證使用者送出資訊的真實性和準確性。如何有效預防使用者送出虛假資訊,保障系統購票的安全?

    2. 12306 的大規模使用者和乘車人數據如何選擇分庫分表?選擇哪個欄位作為分片鍵?如何在老業務上平滑上線分庫分表?出現問題如何快速回滾?

    3. 系統支持會員使用使用者名稱、手機號以及信箱等多種方式進行登入。由於登入時無法確定使用者的分片鍵,造成的「讀請求擴散」問題如何解決?

    4. 在高並行的會員註冊場景下,絕對會出現緩存穿透問題。網上鼓吹的對不存在 Key 進行緩存值設為 Null,以及布隆過濾器等都存在漏洞,如何解決?

    5. 存在較多的敏感資訊,比如會員或者乘車人的姓名、手機號、信箱、證件號碼以及住址,如何防止資料庫被攻擊時造成的敏感資訊泄露?

    再以購票服務為例,當使用者購買兩個乘車人的高鐵一等座票且沒有選座時,座位的分配邏輯如下:

    1. 首先檢查當前列車的一等座余票是否足夠。如果余票不足,直接向客戶端返回購票請求失敗的響應;

    2. 獲取所有車廂中有兩個座位余票的車廂,並對這些車廂進行遍歷,按照下述流程執行;

    3. 首先檢查所有車廂中是否存在一等座車票的相鄰座位。如果所有車廂中都沒有相鄰座位,進入下一步邏輯;

    4. 接著檢查是否有車廂中包含兩個不相鄰的一等座座位?因為同車廂兩座位相鄰座位沒有的話,就退而找同車廂不相鄰座位;

    5. 如果以上邏輯都無法滿足,那麽最後選擇分配不同車廂的不相鄰座位。這種情況下,由於已經確認一等座的余票充足,因此一定能夠成功完成購票;

    6. 透過以上步驟,購票系統能夠在高鐵一等座票余票充足的情況下,合理地分配座位,確保乘車人出行時有良好的座位體驗。同時,如果余票不足,系統會優先滿足乘車人順利購票的需求。

    如何使用

    12306 前端系統實作了與官網極為接近的業務邏輯和 UI 展示。

    在學習過程中,透過類似官網的前端系統直接偵錯後端服務,可以避免純透過介面測試的繁瑣。這種真實場景的模擬,使得學習過程更加流暢高效。

    目前前端系統還在開發中,部份業務及細節處還在調整,完成後統一給出控制台操作手冊,請耐心等待。

    1. 車票查詢功能

    2. 送出訂單頁,選擇乘車人下單

    3. 高鐵線上選座頁面

    4. 訂單確認頁

    12306 購票誤區

    說些大家對於 12306 購票時沒有考慮到的一些業務點,或者存在誤區的地方。

    背景:假設,有一站列車,途徑北京南、濟南西、南京南、杭州東、寧波。

    查詢站點對應的列車車次資訊。

  • 你以為:透過搜尋引擎技術 ElasticSearch 技術解決,因為涉及大量的查詢條件。比如:車次、車組、出發車站、到達車站、出發時間等。

  • 實際上 :當海量並行查詢時,ElasticSearch 的並行能力以及資源占用情況來說,並不適用。而且,大家如果仔細思考,發現這些查詢條件都是可以透過類似於 Redis 的緩存技術儲存,並在記憶體中進行組裝。

  • 買一張北京南到南京南的車票。

  • 你以為:只扣減北京南到南京南單趟的票。

  • 實際上:會扣減北京南-濟南西,北京南-南京南,濟南西-南京南的三趟車票。如果其中有任意條件不滿足都不會購買成功。

  • 買一張濟南西到南京南的車票。

  • 你以為:按照上述邏輯,如果透過軟體惡意刷票,只買濟南西-南京南的票,北京南-杭州東是否就買不到了?

  • 實際上:每個站數之間的數量都有規則。雖然放票時間都是一致的,但是優先大站之間的票量,避免因為大量使用者購買了中間站的車票導致始發站和終點站的購票困難。該問題透過動態放票解決,比如剛開始放票時對小站之間僅開放少量票,大站之間放出來多數票。如果後續接近發車時間,再開放小站間的車票。

  • 當然,業務以及技術上的難點和亮點並不止於這些,更多的資訊可以透過程式碼以及 12306 的使用上進行發掘。

    計畫中的文件包括三部份,快速開始、核心技術文件以及從零到一開發。可根據自己的興趣選擇深入了解核心技術或從零到一復刻系統。

    計畫演示地址

    http://12306.magestack.cn

    原始碼下載地址:

    https://gitee.com/nageoffer/12306.git

    看到最後,如果這個方法對你有用,一定要給我點個「 在看 」。