昨晚,因為核酸系統崩潰,這家公司被罵上了熱搜第一

語言: CN / TW / HK

大家好,我是軒轅。

昨天晚上,成都因為疫情又一次上了熱搜,而這一次,熱搜上的詞條是一家軟體公司的名字。

事情的起因是這樣的:

從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、程式語言中的協程等等技術都能為提高併發助力。

回到這次崩潰事件上,我想著經過一夜的折騰,今天總該好點了吧,結果下午一開始,又繼續擺爛了:

在我寫這篇文章的時候,當事公司已經發布了說明:

網路:你的意思是怪我咯?