昨晚,因為核酸系統崩潰,這家公司被罵上了熱搜第一
大家好,我是軒轅。
昨天晚上,成都因為疫情又一次上了熱搜,而這一次,熱搜上的詞條是一家軟體公司的名字。
事情的起因是這樣的:
從9月1號開始,成都市政府宣佈了為期四天的全員核酸檢測。昨天下午,我們小區物業通知了預計14:00-17:00會進行檢測,告訴我們會挨個樓棟通知下去檢測。
結果一直拖到晚上也沒收到通知,我一直忙別的也沒留意,結果上網一看,關於成都核酸系統崩潰的各種段子已經滿天飛了。
是的,成都核酸檢測系統,又崩潰了!
辛苦的大白們沒有辦法,都用上了這種古老的方式來尋找“訊號”。
因為這個系統出了問題,導致核酸檢測工作非常緩慢,大量的市民排隊等待,平常排隊半小時能完成的,昨晚都要排隊好幾個小時。
到晚上23點半,物業直接通知只給部分人做,其他人可以洗洗睡了。好傢伙,不知道有多少人白排了幾個小時隊。
這好好的系統它咋就崩潰了呢?
有網友挖出了一箇中標公告,說這套系統背後使用的是浪潮的伺服器:
一千多萬的專案,結果就這?
但隨後,有疑似浪潮的人出來回覆:
人家說的很清楚,上面中標的只是基礎運維,這套軟體系統的設計另有其人。
隨後有人又開噴健康碼,噴鵝廠。
但實際上,崩的不是健康碼,而是大白使用的核酸採集錄入系統,這是兩套獨立的系統。
再接著,有人爆出這套軟體是東軟公司做的。
於是一時間,所有人把怒火對準了東軟,很快就把東軟這個詞條送上了微博熱搜榜第一的位置。
關於崩潰的原因,也有各種說法在朋友圈、微信群裡流傳,一時難辨真假。
有說是這套系統背後使用的MySQL使用了超寬的大表:
有說是MySQL單表容量太大,造成效能下降:
還有的說是因為負載均衡不行,沒法支撐高併發。
總結起來基本上就兩個原因:
1、資料庫的問題,資料量大後,查詢檢索效率低下。
成都全市人口超過2000萬,每天一次核酸,那就是單日新增兩千萬條記錄,最近幾天一直在做,資料容量很快就是幾億的規模,如果後端用MySQL還不分表,那確實夠嗆。
2、高併發的問題,同一時間大量請求,伺服器扛不住。
一般情況下,使用nginx負載均衡,單機能做到幾萬的併發量。但成都2000W+的人口規模,全面做核酸的情況下,幾萬的併發肯定是不夠用的。
倘若這套系統背後真的就是一個nginx+mysql(不分表),那昨晚的情況也就不足為奇了。
好了,吃瓜歸吃瓜,我們還是要來點乾貨,作為一個程式設計師,要在吃瓜中學會成長。
高併發之路
這篇文章,我們來回答一個問題:到底該怎麼做高併發?
讓我們從零開始。
1、單機時代
一開始的時候,使用者量很少,一天就幾百上千個請求,一臺伺服器就完全足夠。
我們用Java、Python、PHP或者其他後端語言開發一個Web後端服務,再用一個MySQL來儲存業務資料,它倆攜手工作,執行在同一臺伺服器上,對外提供服務。
2、應用與資料庫分離
慢慢的,使用者量開始多了起來,一臺伺服器有點夠嗆,把它們拆開成兩臺伺服器,一臺專門執行Web服務,一臺專門用來執行資料庫,這樣它們就能獨享伺服器上的CPU和記憶體資源,不用互搶了。
3、快取系統
後來,使用者量進一步增加,每一次都要去資料庫裡查,有點費時間,引入一個快取系統,可以有效縮短服務的響應時間。
4、軟體負載均衡
使用者量還在增加,一個Web服務的吞吐量開始達到了上限,系統開始出現卡頓。這時候,可以複製多個Web服務出來,再用一個nginx來進行負載均衡,將請求分攤到所有Web伺服器上,提高併發量。
5、資料讀寫分離
隨著系統的執行和使用者的增長,資料量越來越多,資料庫的瓶頸開始顯現,讀寫明顯變慢。這時候,可以增加新的資料庫伺服器,將讀寫進行分離,二者做好資料同步,提高資料庫服務的整體I/O效能。
6、資料庫分庫分表
系統中的資料越來越多,即便是讀寫分離了,但一張表中的記錄越來越多,從幾百萬到幾千萬,甚至要過億了。把它們全部塞在同一張表裡,檢索查詢耗時費力,是時候進行分庫分表,把資料拆分一下,提高資料查詢效率。
7、硬體負載均衡
再後來,業務發展很不錯,使用者量激增,以至於強勁的Nginx也扛不住了。
一臺不夠,那就多整幾臺,再引入一個硬體負載均衡的伺服器,比如F5,將網路流量分發到不同的Nginx伺服器上,再一次提高效能。
8、DNS負載均衡
再再後來,使用者量還在蹭蹭蹭的增長,強悍如F5這樣的硬體負載均衡伺服器也扛不住這樣的高併發。
老辦法,一個不夠那就多整幾個。這一次,咱們在域名解析上下功夫,不同地區的使用者,在訪問同一個域名時,解析到不同的IP地址,以此來將流量進一步拆分。
上面就是從最簡單的單機到複雜叢集的高併發演進之路。
高併發是一個很大的話題,它所涵蓋的東西其實遠遠不止上面這些內容。除了這些之外,像是訊息佇列、資料庫選型、CDN、程式語言中的協程等等技術都能為提高併發助力。
回到這次崩潰事件上,我想著經過一夜的折騰,今天總該好點了吧,結果下午一開始,又繼續擺爛了:
在我寫這篇文章的時候,當事公司已經發布了說明:
網路:你的意思是怪我咯?
- Spring中實現非同步呼叫的方式有哪些?
- 帶引數的全型別 Python 裝飾器
- 整理了幾個Python正則表示式,拿走就能用!
- SOLID:開閉原則Go程式碼實戰
- React中如何引入CSS呢
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫程式語言-遞迴函式是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多執行緒永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- LeCun再炮轟Marcus: 他是心理學家,不是搞AI的
- Java保證執行緒安全的方式有哪些?
- 19個殺手級 JavaScript 單行程式碼,讓你看起來像專業人士
- Python 的"self"引數是什麼?
- 別整一坨 CSS 程式碼了,試試這幾個實用函式
- 再有人問你什麼是MVCC,就把這篇文章發給他!