- 騎士資本集團(英語:Knight Capital Group),俗稱騎士資本,是一家美國金融服務公司,主要業務包括做市、電子交易執行、機構銷售等。
更新功能
- 系統 SMARS是接收Knight交易平臺其他組件的訂單(父訂單),然後發送一個或多個子訂單執行。換言之,SMARS將從交易平臺收到大量訂單,並將它們分成多個較小的訂單,以便找到股票數量相匹配的買家或者賣家。父訂單越大,生成的子訂單越多。
- 在SMARS中,有一段老舊的代碼,名為「Power Peg」,它已經8年沒被用到過了,而此次更新的目的正是要換掉這段代碼。更新的代碼重新調整了用於激活Power Peg功能的舊標誌的功能。
- Power Peg代碼用於在執行子訂單時,根據父訂單計算購買或者出售的股份。Power Peg將指示系統在完成父訂單後停止傳送子訂單。也就是說,Power Peg會跟蹤子訂單,並在父訂單完成後停止它們。
CI/CD
- 2012年7月27日至2012年7月31日期間,Knight的開發人員每天手動將新的軟體部署到公司的8臺伺服器上。 然而,在新代碼的部署過程中,Knight的一名技術人員忘記將新代碼複製到所有8臺SMARS計算機伺服器中——他漏掉了其中一臺伺服器。
上線後發生
- 到2012年08月1日上午9點32分,華爾街的人們都在想,為什麼訂單還沒有停下來,為什麼沒有人按下任何系統的關閉開關?結果他們發現,並沒有關閉開關。在交易的前45分鐘裡,Knight的交易量佔了總交易量的50%以上,這使得某些股票的市值上漲了10%以上。因此,其他股票因錯誤的交易而貶值。
- 在上午8:01到9:30之間,Knight工作人員也收到了97封郵件。可惜的是,這些電子郵件不是作為系統警報設計的,因此沒有人立即查看它們。
- 在Knight經歷的45分鐘內,他們嘗試了幾種反制措施,試圖阻止錯誤的交易。由於沒有終止開關,所以他們只能在實時交易環境中嘗試診斷問題。
- 每分鐘,系統上約有800萬股股票被交易。他們無法確定是什麼導致了錯誤的命令,所以他們從正確部署的伺服器上卸載了新代碼。換句話說,他們刪除了工作代碼,留下了損壞的代碼。
- 這更加放大了問題。最開始,僅在部署不正確的伺服器上,額外的父命令激活了Power Peg代碼。現在,問題蔓延到了所有伺服器上。
- 最後,他們終於停止了系統,但此時已經進行了45分鐘的交易。
企業損失
- 在開盤前45分鐘,市場收到並處理 212份父訂單。因此,SMARS向市場發送了數以百萬計的子訂單,產生了400萬筆交易,而其中154 只股票的交易量超過了3.97億股。
- 這意味著,Knight資本集團在45分鐘內造成了4.6億美元的虧損。然而,Knight只有3.65億美元的資產。
- 45分鐘後,美國股市最大的交易商、紐約證交所和納斯達克的主要做市商Knight破產,4個月後被Getco LLC收購。
所犯的軟體工程錯誤 - CI/CD
- 程式: 接訂單, 拆訂單, 追蹤訂單 想像一下,如果你有一個系統,它能夠向市場發送自動化、高速訂單,且沒有任何跟蹤程序來檢查是否執行了足夠的訂單,會發生什麼?沒有比這更糟糕的事了
- 人工部署, 不是由程式自動部署 到 多個 Server
- 沒有人去檢查 部署後程式, 是為最新的程式
- 十年前的 拆單程式沒有用, 郤沒有刪掉
- 用舊 Feature Flag , 而不是用新的 Flag , 導致新程式郤用 舊 Feature Flag, 導致新程式沒有更新, 反而用到 舊 Feature Flag 而導致出錯
- Monitor 沒做好, 導致事情發生時, 無法立即找出問題
建議Solution
- Rollback : 1 - 8 台 Server 所有的程式
- 關掉新的 Feature Flag
- 重大 Issue - 用 A/B Test for 1% User 測試
- 發送自動化、高速訂單, 也要設計跟蹤程序來檢查訂單的合理性. 異常處理機制
Phoenix 心得
- CI/CD 自動部署的重要性
- 程式上版的 Review 機制上線後 Monitor 和 Rollback 機制
以上就是我的分享. 若對你有幫助, 請在下面 按讚、留言. 或 愛心符號. 你的肯定, 是我撰寫的動力.
Phoenix 鳳哥