《天命2》服務中斷與帳號回溯

2020 二月 11 - Destiny Dev Team

在今日(2月11日星期二)稍早,熱修復2.7.1.1版上線之後,我們發現某個遊戲錯誤又捲土重來,並導致一小部分的玩家失去貨幣和材料。這個狀況不久前也發生過,在熱修復2.7.1版於1月28日推出時,所有玩家都失去了貨幣和材料,使得我們事後必須回溯玩家的帳號。針對今天所發生的狀況,我們也採取了類似的做法,並把受影響遊戲帳號的狀態回溯到太平洋時間的早上八點半(當時2.7.1.1版本還尚未發布)。

這兩起事件的發生原因與後續影響皆相同,而且在短期內連續出現兩次,因次我們想要在這邊稍微說明一下事件的始末,並解釋我們如何修復它,同時告訴大家我們計畫如何避免相同的狀況在未來再度發生。首先我們要來看到的是這個問題最一開始的起因,也就是牽涉到物品欄管理的遊戲錯誤以及一系列的伺服器配置問題,最終導致這個已經被修復過一次的遊戲錯誤再次浮現。

物品欄管理

在《天命2》中,支線任務的機制跟貨幣和材料等其他物品的機制類似。每個物品都有時間戳記,並會顯示出物品第一次被新增至玩家物品欄的時間點。這個時間戳記的用途是讓玩家可以按照取得時間為支線任務進行排序。玩家每次登入時,遊戲系統都會整理玩家的物品欄,確保物品欄跟其內容物有達成一致,比方說玩家對於某種類型物品的最大可攜帶量。

幾個月前,有玩家回報說支線任務日誌的排列功能運作異常,所以我們嘗試修復它。遊戲團隊在經過調查之後,發現整理物品的程序會重置某些支線任務的時間戳記,也就因此破壞了以時間排序的功能。我們決定停用支線任務的重置時間戳記功能,藉此來修復這個錯誤。這種修復錯誤的方式就概念上來說是合理的,但是在受到許多微小副作用的影響之後,它最終演變成了停用過多整理程序的慘劇。我們所看到的結果是,遊戲對於複數物品(例如貨幣和材料)最大數量的計算錯誤,導致超過最大數量上限的部分消失。我們知道跟物品有關的程式碼很重要,我們平常都會聘請兩個該領域的專家來檢查更改過後的程式碼。但不幸的是,這次我們並沒能事先檢查出錯誤的存在。

幾天之後,我們自己內部的測試團隊發現了這個問題。但是,我們卻誤以為這個問題是工具錯誤(在偵錯工作流程中用來測試的工具)所造成,而不是遊戲中確實存在的錯誤。即便我們已經做了重重的把關,這個遊戲錯誤最終還是跟著2.7.1版本一起出現在了遊戲中。在我們發現遊戲伺服器中存在這個錯誤之後,我們接著要開始思考該如何修復它,也就進入了我們下一個要討論的話題:遊戲伺服器與伺服器的配置。

伺服器配置

在每次的大型改版(例如:《暗影要塞》)推出之前,我們都會做全面的壓力測試,試著做出符合使用者行為及其影響的服務架構。因為我們無法模擬出數百萬名真人玩家的行為,所以我們都是在遊戲新版本發布之後,透過密切觀察服務矩陣的方式來補做這項測試。

在去年十月份《暗影要塞》推出時,為了處理CPU用量與玩家數提高的問題,我們加入了更多伺服器(在這次的案例中稱為WorldServer);當時所使用的伺服器數量遠比先前任何一次都還要多。這麼多的伺服器同時運作對遊戲產生了一些微小的副作用,雖然我們一直持續追蹤著這些副作用,但是基本上玩家是看不見它們的。舉例來說:有一小部分(少於1%)的伺服器會在初始化時當機,這是因為伺服器的數量壓垮了其中一個備援資料庫。我們所採取的應急措施是,每當我們發現這個問題時,就手動重啟當機的伺服器。這樣的做法似乎可以解決問題,同時也不會讓玩家在遊戲中感受到任何副作用。

讓我們把時間快轉到兩個禮拜前。2.7.1更新檔存有上述提到的遊戲錯誤,導致遊戲角色的資料損毀,並導致我們史上第一次回溯角色資料。為了快速修復這個問題,我們只針對伺服器的部分進行修正,並沒有幫遊戲寫入完整的程式碼。在這麼做的過程中,我們更動了一項伺服器設定,導致伺服器可以覆蓋遊戲中用來處理角色資料的程式碼。緊接著,我們還重新啟動了WorldServer,讓這項改動生效。 

讓我們再次快轉時間到今天(2月11日),也就是我們同時推出2.7.1.1版本和緋紅之日活動的時間點。在新版本推出之後,一部份的WorldServer在初始化時再次當機,因為同時有大量的伺服器開機。我們也比照之前的處理方式,手動重啟當機的伺服器,以為事情就這樣結束了。可沒想到…… 

就在不知不覺中,這次的當機事故導致那些WorldServer沒有套用到先前對於角色資料損毀的修正內容。這就表示,有一小部分的WorldServer會運行舊的程式碼,進而毀損角色資料。我們有專門的驗證系統負責偵測這種出錯的版本配置,但是因為WorldServer當機而且後續是由人為手動重啟的關係,導致伺服器沒有經過驗證系統的驗證。在今天早上出事之前,我們本來以為這些覆蓋和驗證的程序是沒有辦法被跳過的。

我們請自己內部的測試團隊使用測試帳號登入,確保玩家體驗沒有問題,這是我們測試新版本的標準做法的其中一個環節。我們總共有好幾百個伺服器,在手動測試的過程中,我們碰巧都遇到了「狀況良好」的伺服器,佔比很低的不良伺服器則是一個都沒有碰到。所以我們以為沒事,就放行了。

在2.7.1.1版本於今天實裝到遊戲裡面之後,我們開始看到有玩家向我們反應貨幣不見了。遊戲團隊立刻開始著手調查,並且在太平洋時間的早上十點半關閉遊戲。在我們採取這個行動之前,已經有好幾十萬名玩家登入過遊戲,或是透過第三方服務使用過他們的角色。經過調查發現,我們原以為不可能出現的狀況發生了:一小部分的WorldServer沒有載入正確的配置(也就是在2.7.1版本中修正損毀資料的配置)。不幸的是,透過這些沒有正確更新的伺服器使用遊戲角色的玩家,都遇到了角色資料損毀的問題。

在我們確定這個問題跟1月28日所發生的狀況相同之後,我們瞬間明白了事情的始末。遊戲團隊也立刻做出判斷,決定使用備援資料庫把所有角色的狀態都回溯到2.7.1.1版本推出之前的時間點,而不是個別針對受到影響的帳號進行檢查,因為這樣有遺漏的風險。 


未來的預防方法

遊戲團隊找到了幾個額外的保護措施,應該可以在未來防止同樣的狀況再次出現。 

1) 我們針對「熱修」伺服器的程序新增了額外的保護措施,確保伺服器在啟動時不會載入錯誤的版本。這個改動在今天遊戲恢復正常之後已經正式生效。
2) 我們修正了幾個會導致WorldServer的一小部分在初始化時當機的錯誤。這個修復項目會跟著第10賽季一起推出。 
3) 我們會在下一次的遊戲更新中永久修復角色資料損毀的問題,這個修復內容將會是可執行的檔案,這樣子日後就不需要再覆蓋配置了。(可惜的是,熱修復2.7.1.1版本過於複雜,所以無法適用)。
4) 有關未來的部分,我們正在調查有沒有方法可以讓回溯和復原的機制變得更快。
5) 在未來的遊戲版本中,我們會解決相關問題,讓伺服器不會再跳過載入配置資料的程序。
6) 我們也會替登入帳號時的整理用程式碼加入更多保護措施,藉此預防遊戲錯誤發生在這麼重要的資料裡面。
7) 我們正在更新我們開發遊戲的方法,以利在推出遊戲新版本之前提早偵測出這種類型的遊戲錯誤。 

在經過今天的回溯作業之後,所有角色的帳號都會變回太平洋時間八點半左右當時的狀態。遊戲團隊也正在努力準備熱修復2.7.1.2版本,並預計在2月13日推出。請留意,這個熱修復同時也會解決無限黎明劍客的問題。

我們知道今天遊戲服務中斷且角色資料回溯的這兩件事情會讓玩家感到很沮喪,尤其緋紅之日活動還是在今天剛剛推出的。我們在知道這樣的錯誤已經是第二次發生且本該避免時,也同樣感到很沮喪。很抱歉造成困擾,我們日後會努力預防類似的事情再度發生。如果你在進行《天命》時遇到問題,請前往Bungie Help網站或推特的@BungieHelp頁面與我們聯繫。謝謝各位的耐心等候!

本網站使用cookie為你提供最佳的用戶體驗。點擊「接受」,即表示你同意Cookie政策隱私權政策中的政策。