第55章 如果企鵝要做

投票推薦 加入書籤 小說報錯

  張老師繼續畫:「加連接池。提前建好一批連接,誰要用就借一個,用完還回去。這樣不會每次請求都新建連接。做到這一步,能扛到三千人。」他又標了一個數字。

  「給常用查詢欄位加索引,能到四千。」往上又標了一個。

  葉明問:「那文本文件那塊呢?還有優化的空間嗎?」

  張老師看了他一眼:「你那個文本文件,現在多大?」

  「八百條事件。上線先用五百條,後面內容團隊會繼續寫,很快能到三千條。」

  張老師點頭:「三千條事件,純文本幾百KB。就算以後到一萬條,也就一兩MB。你那台伺服器內存至少1G,這點量完全不是問題。」

  葉明追問:「那除了把文件加載進內存,還有別的優化可以做嗎?」

  張老師想了想:「事件多了以後,你得考慮『熱點』的問題。不是所有事件被觸發的頻率都一樣。

  有的事件可能一天觸發幾萬次,有的可能幾天才觸發一次。

  那些高頻事件,你可以把計算結果緩存起來,不用每次都重新算一遍。」

  他在白板上又畫了一個框,標上「計算結果緩存」:「這叫『熱點事件結果緩存』。跟你那個文本文件加載,一個解決的是IO問題,一個解決的是CPU計算問題。兩個層面的東西。」

  葉明把這些都記下來:「那怎麼判斷哪些是熱點事件?」

  張老師笑了:「上線跑起來就知道了。看日誌,哪些事件觸發次數最多,哪些事件讓伺服器CPU飆得最高。數據會告訴你答案。做技術的人,不能靠猜,得靠數據說話。」

  葉明點頭,又問:「那排行榜呢?排行榜的壓力怎麼解決?」

  張老師繼續畫:「把排行榜做成靜態頁面,五分鐘更新一次。用戶訪問的時候直接讀靜態文件,不用查資料庫。這樣排行榜的訪問壓力就沒了。」

  葉明追問:「五分鐘會不會太慢?用戶看到的數據不是實時的。」

  張老師看了他一眼:「你這個遊戲,需要實時排名嗎?

  玩家在乎的是自己排在第幾名,還是在乎『我比昨天進步了』?

  想清楚這個問題,你就知道五分鐘夠不夠用了。

  很多時候,用戶要的不是絕對實時,是『看起來實時』。」

  葉明愣了一下,把這句話也記下來。

  葉明又問:「那排行榜的靜態頁面放在哪裡?放在自己伺服器上就行嗎?」

  張老師點頭:「放你自己伺服器上就行。用戶訪問的時候直接讀靜態文件,壓力小很多。」

  葉明追問:「那如果流量再大呢?靜態頁面也扛不住的時候怎麼辦?」

  張老師笑了,在白板上又畫了幾個框,連成一張圖:「做負載均衡。

  前面加一個分發器,後面掛多台伺服器。

  用戶的請求先到分發器,分發器決定交給哪台伺服器處理。

  這樣每台伺服器的壓力都變小了,整體能扛的流量就上去了。」

  葉明盯著白板看了一會兒:「那用戶的數據怎麼辦?比如用戶登錄了,下次請求被分到另一台伺服器,不就丟了?」

  張老師笑了:「問到點子上了。所以得把用戶會話單獨拎出來,放Redis里。

  Redis是一種內存資料庫,讀寫速度極快。

  所有伺服器共享一份會話數據,用戶不管被分到哪台機器,都能讀到自己的登錄狀態。」

  葉明追問:「Redis也是存在內存里的?那和MySQL有什麼區別?」

  張老師在白板上又畫了一個框,標上Redis:「MySQL是硬碟資料庫,數據存在硬碟上,讀寫慢,但容量大、持久化。

  Redis是內存資料庫,數據存在內存里,讀寫快幾十倍,但容量小、斷電就丟。

  所以各司其職。MySQL存持久化數據,Redis存臨時會話和緩存。」

  葉明把這些都記下來,又問:「那事件庫呢?多台伺服器共享,每台都得有一份?」

  張老師點頭:「對。事件庫是文本文件,每台伺服器都得放一份。更新的時候要同步,麻煩一點,但也不是不能做。」

  葉明追問:「那資料庫呢?多台伺服器共享一個MySQL?」

  張老師搖頭:「MySQL扛不住的時候,也得拆。做讀寫分離,主庫負責寫,從庫負責讀。

  主庫的數據實時同步到從庫,寫的壓力集中在一台機器上,讀的壓力分散到多台機器上。

  這樣讀的流量再大也能扛住。」

  葉明把這些都記下來,又問:「那主庫和從庫是分不同的伺服器嗎?」

  張老師點頭:「當然。主庫一台,從庫可以掛好幾台。主庫掛了,從庫還能頂上。這叫高可用。」

  葉明把這些都記下來,又問:「那CDN呢?和負載均衡有什麼區別?」

  張老師笑了:「CDN解決的是帶寬和延遲問題。你把靜態文件丟給CDN服務商,網宿、藍汛這些公司,他們幫你分發到全國各地的節點上。

  用戶訪問的時候,就近取數據,不用繞到你那台單核至強上。

  負載均衡解決的是伺服器壓力問題,CDN解決的是網絡傳輸問題。兩個層面的東西。」

  他頓了頓,又補了一句:「不過這些都是以後的事。你現在,先把那台單核至強跑明白。」

  葉明把這些都記下來,又問:「張老師,那按照這個思路,我這台伺服器到底能扛多少?」

  張老師想了想:「連接池加上,索引加上,熱點緩存加上,排行榜靜態化,你這台單核至強,同時在線扛到八千到一萬,問題不大。加上CDN,能到兩萬到三萬。再往上,就得做負載均衡、讀寫分離了。純文字遊戲,同時在線兩萬到三萬,換算成日活,大概四十萬以上。」

  葉明把這些數字都記在本子上。

  張老師講完,放下筆,轉過身看著他:「你現在得想一個問題。」

  葉明抬頭。

  「你這個遊戲,如果企鵝要做,你怎麼辦?」

  葉明沉默了幾秒。

  「張老師,這個問題我一直在想。」他頓了頓,「現在有些想法,但還不成熟。等我再琢磨琢磨,到時候再來找您請教。」

  張老師看了他一眼,點了點頭:「行,那你想清楚了再來。」

  他拍了拍葉明的肩膀:「回去把這些消化一下。有問題隨時來。」

  葉明把筆記本和U盤收好,站起來:「張老師,謝謝您。」

  張老師送他到門口:「你身上有這個勁,別丟了。」

  葉明點頭,走出辦公室。陽光從走廊盡頭的窗戶照進來,落在地板上。

  他走得很慢,腦子裡還在轉張老師最後那句話。

  如果企鵝要做,你怎麼辦?

  他又想起剛才屏幕上那條事件,想起那天晚上。

  他得為那條事件做一個隱藏成就。

  不是為了玩家,是為了她。

  他不知道的是,此刻許薇還坐在計協機房裡,有些心不在焉地寫著事件,偶爾瞥一眼他的空位。

章節目錄