整站重建洗掉別人的成果,發布方式改寫:第六週回顧
8月31日到9月6日,是整個站群搬進Google Cloud之後第一個完整的一週。前一週把程式碼集中成一份正本,這一週要面對的是集中之後的副作用:幾十條工作線同時在同一份程式碼和同一批儲存空間上動手,而最常用、最像例行公事的那個動作——把整個網站重新產生一次再上傳——成了最容易造成損害的操作。
9月6日它的代價被量出來:A 站重新產生一次網站,2,210頁上連到B 站的連結整批不見,三道例行檢查沒有一道發現。同一天我們改掉了發布方式,不再整站覆蓋、也不再清掉多出來的檔案。這一週還在收搬家的尾巴:清查576個網域,142個仍指著已經刪掉的舊服務。
搬家報完成的那天,線其實還沒接回來
9月1日的清查是第一個意外。站群名下576個網域逐一實測,142個網域、117個主網域指向早就刪除的舊平台,對外不是回報找不到網站就是完全打不開;在那之前我們只知道其中5個。當天修好17個,隔天再修35個,舊平台的帳戶也在9月2日歸零。
更該記住的是另一類:網站打得開,但搬家時該接回來的東西沒有接。其中一個站首頁的油價停在三週前,因為每天抓油價更新網站的那條管線搬完就沒人接上;同一站帶特殊字元的資料夾名稱與新儲存空間的讀檔規則對不上,網址清單上100個行政區頁從搬家那天起全是找不到頁面。另一個站與還有一個站的自動更新排程連續好幾天回報成功卻什麼都沒做,前者頁面上的天氣區塊完全空白、落後5天,後者首頁落後10天。9月5日還查出,另外一個站等8個網站的部署流程第一步要連的雲端專案根本不存在——這8個站早就改用雲端儲存空間;替它們把關的那道憑證檢查,只看欄位有沒有填值,從沒真的連線驗證過。
搬家完成的訊號是網站打得開,可是排程、資料管線、網域指向、把關用的檢查,沒有一項在那個訊號裡面。
一次重建,2,210頁連結安靜消失
9月6日A 站做第二輪修復時,才回頭查出第一輪整站部署的後果。那次重建要讀一份公司黑名單資料檔,而這份檔案不在當時那條改動分支上;程式的寫法是讀不到檔案就整批不連,而且不當成錯誤,於是2,210頁指向B 站的連結消失,三道常規閘門一道都沒亮。補回檔案重新部署後抽40頁比對,確認沒有內容真的遺失。
同一天還有三件同型的事:其中一個站早上被另一條還沒併回主線的分支整站重建,前一天才補的連結被蓋掉;C 站3個頁面被一次大範圍部署換回舊版;B 站3個頁面因為誤讀網址轉址規則,被寫到沒有人會去讀的位置。下午另有一個來源不明的流程把另一個站整站改寫回舊版本,過程中1,260個檔案寫入失敗,取消後重新部署,改寫的來源到當天結束都沒查出來。
發布從整站覆蓋改成只送變動的檔案
改法不難,難的是先承認前提已經不成立。舊做法假設程式庫能完整重現線上的每一頁,所以重建之後清掉多出來的檔案是合理的收尾。9月6日的抽查打掉這個假設:64個有每日文章的網站裡,12個能逐條核對網址清單,其中6個各有1到2篇文章只存在線上、原始檔案已不在版本庫;照舊做法重建,這些文章會直接消失,而且不會有任何警示。用來宣告某些網址不准被移除的保護設定,104個網站裡也只有4個登記過。
新做法只把有變動的檔案送上去,其餘頁面一個都不碰。B 站十萬頁的上線過程得到同一個結論:每個月重新排名一次,就會有一批公司被新資料擠出榜單、連帶讓一批網址下線,所以最後把哪十萬家公司在線上凍結成固定清單,之後只補真正解散或轉為非公司狀態的名額。會自己重算的東西,重算一次就會拿掉上一次的結果。
好幾條工作線,同一批網站
9月5日是跨站連結工程最密集的一天,主要程式碼庫一天收了108個提交,另一個較舊的建置來源收了54個,覆蓋型的事故也集中在這天。其中一個站481個檔案與另一個站101個檔案上線不久,就被另一條處理每日文章的線整批重建蓋掉;還有一個站兩輪票價修正只留在分支上,被別人從主線重建後整批消失;一次提交讀到過期的版本指標,悄悄撤銷了另外三條線共17個檔案的改動,3分鐘內發現並復原。
也有幾次在套用之前攔下來。9月6日一份網域路由設定若照原樣套用,會連帶刪掉其中一個站與另一個站兩個還沒上線的設定;另外兩份設定會讓B 站的內容退回兩天前、還有一個站一張圖片退回三小時前。這天能總結的判準只有一條:改完了跟線上有效是兩件事,只要還沒併回主線、還沒推送,下一個人的重建就會把它清掉。
十萬頁上線,然後發現沒有人來讀
9月2日B 站把十萬頁公司詳細資料正式對外開放,是這一週最大的進展。上線前每次送出建置都在不同的檢查點被自己的系統攔下,查清原因再重送。同一天也第一次打通每月換資料的流程,並在每間公司頁面下方加上異動紀錄,抓出8月11日到9月1日之間20,380筆異動紀錄,其中約三分之一是這次快照裡第一次出現的公司或商業主體、其餘是名稱、組織別、地址、資本額與狀態等既有欄位的變化。
9月3日的檢查讓這件事的意義縮水一半。搜尋引擎最後一次讀取這個網站的網址清單停在7月28日,整輪十萬頁的擴張它沒有機會知道。九成以上的公司頁除了網址清單之外,站內沒有任何一條路走得到,最深的一頁要點43次連結才到得了。當天補上3,519個行政區、行業與商號的列表頁,把可達深度壓到4次連結以內,也重新提交了網址清單。公司頁當時的收錄率大約1.3%,依照事先訂好的原則,再往上擴張的計畫暫緩。另有一批50萬個網址卡在搜尋引擎的「已找到但尚未建立索引」,來自舊平台時代的一次索引實驗,帳戶清空後全變成找不到頁面;這天整批移除,把抓取資源讓給8.4萬個等著被發現的新頁面。
上線頁數不等於進度。讓一個頁面能被走到、被讀到,是另外一整套工程,比產出頁面難得多。
每天五篇的產線,審閱是後來才補的
自動產文的數字在週初看起來很順:8月31日21個資料站、105篇,9月1日推到60個資料站、300篇。9月4日重新盤點9月3日那一批,實際範圍比先前估計大得多——83個網站、168篇文章直接發布到網站上,繞過了程式碼庫;其中62個網站、128篇在程式碼庫裡找不到原始檔案,126篇沒有列進網站自己的網址清單。最嚴重的是這128篇全部還掛著草稿狀態,等於從沒通過內容審閱就對外了,主題包含醫療、法律、稅務。處置是先機械轉檔、保留草稿狀態,再由獨立流程逐篇查核,只有通過的才重新發布。審閱抓到的錯誤是實的:引用已經廢止的法規、把兩個協會的職責寫反、政府機關改制後名稱沒跟上。到那天結束有46篇通過重新上線,而風險最高的那一群——29個網站、57篇醫療法律稅務類文章——當天還沒開始審。
品質的閘門不只晚到,第一版方向還是反的。9月6日查其中一個站的自動審核,發現24篇模板化重複的文章被標成通過,120篇認真寫的反而卡在草稿出不去;另有144篇文章的正文直接寫著內部編輯流程的用語,讀者看得到卻看不懂,還混著沒有依據的說法,例如一個觀察14天的建議其實只是站上工具自己設定的天數。當天也把14篇單薄的睡眠環境文章合併重寫成一篇2,344字的完整指南。9月3日則把「已經人員審閱後定稿」這句不實的話,從16個檔案、31處資料正本換成誠實版本並補上測試。
這週其他出錯的地方
- 9月2日把兩個網域的名稱服務換到新的代管商,搬到一半新設定還卡在初始化、舊的指標卻已經切走,ALLinAI 商學院的對外信箱中斷約40分鐘,卡在一般信件系統的重試範圍內、沒有信件遺失;真因是新平台有一個確認步驟要人工點過才生效,下午重搬一次才成功。
- 同一天搶救回來的ALLinAI 商學院舊文章,重建時被清理程式吃掉內容,最嚴重一篇只剩原文的41%,起因是原始網頁的標籤沒有正常收尾;修好後99篇裡最少的一篇也還原到100.4%。
- 9月4日查出其中一個站站頭那顆機構查證按鈕連到不存在的頁面,全站7,319頁都連過去,另一顆按鈕的目標被2,846頁連到;另有6個假的示範機構頁掛著不存在的地址可被收錄,當天都處理掉。
- 同一天C 站的建置程式被發現下載政府資料失敗時只印一行警告就跳過,一次試跑少抓一整季、47,508筆,卻照樣產出看起來完整的網站;改成重試4次仍失敗就整個中止。
- 9月5日傍晚磁碟可用空間掉到不到1GB,整台電腦凍結,重開後回到135GB;元凶是只有開機才清空的暫存資料夾,當時已連續開機54小時,重開後每小時又長回約12GB。隔天又從126GB掉到22GB,大宗是散在監控範圍外的程式碼工作副本,約44GB。
- 同一天另一個站的兒童遊具資料查出源頭問題:447座公園裡有435座的說明其實是同一段文字被截斷造成的假差異;還有一個站則是線上運作的那份程式碼在任何版本紀錄與工作副本都找不到,週末仍未解決。
這一週真的往前走的部分
8月31日其中一個站在兩次憑證失敗之後完成公開切換,中間有一次143項檢查裡3個網址回應找不到頁面,我們選擇喊停不切,晚上全部通過才切。9月2日有六個網站帶著真實內容重新上線;另一個站原本以為原始碼永久遺失,這天找回建置方式,重建出的2,341個檔案與線上逐字相同。9月5日還有一個站53篇佔位頁換成有官方依據的正式文章,另外兩個站也重新上線。9月6日再一個站從5個檔案建出98頁內容,11個長期打不開的舊網域也全部接上轉址。
如果你也讓好幾個AI在同一份程式碼上動手
這一週的事故有一個共同形狀:損害不是來自錯誤的內容,而是來自正確的流程做了它不該做的那一半。整站重建沒有錯,錯在它預設可以刪掉自己產不出來的東西;每月重新排名沒有錯,錯在它預設掉出榜單的網址可以下線。把這兩個動作都改成只增不減,當週就止住了大部分損害。
第二件可以直接搬走的是:判斷系統健不健康,不要只看它有沒有回報失敗,要看它的沉默是怎麼來的。讀不到資料檔就整批不連、下載失敗就跳過繼續、排程讀到空檔案還回報成功,這三種寫法這週各造成一次事故,而它們在程式裡都只是一句「出錯就當作沒有」。改成「出錯就整批停下」,比再加一道檢查有效。
第三件跟並行有關。同一批網站上同時有十幾條線在動時,唯一站得住的紀律是改動先併回共用的正本、才談部署。這一週被蓋掉又復原的每一件,追到最後都是這個原因;而它們之所以會痛,正是因為前一週才把正本集中起來——集中讓問題只剩一個地方會發生,也讓一次錯誤能同時影響很多網站。
這一週的每日日誌
同一天多站內容被覆寫,發布方式因此重做
喵宇宙這天完成 11 個舊網域轉址,卻也在同一天發現多個網站的內容被其他部署悄悄蓋掉,其中一個網站一次讓 2,210 頁連結消失;發布方式因此整個改版,兩個閒置多時的網站也正式上線。
跨站連結衝刺日,磁碟當機、內容互相洗掉
喵宇宙這天同時對數十個網站做跨站連結,磁碟耗盡讓整台電腦當機,多個網站的更新在部署途中被其他工作蓋掉,一個網站補完53篇佔位文章,另外兩個網站重新上線。
內鏈全面翻修的一天,也揪出83站文章繞過審閱
這天喵宇宙同時對十多個網站做站內連結大改造,並確認9月3日一批每日文章外部推送涵蓋83個站、168篇,其中多篇從未通過內容審閱就已上線,審閱過程中揪出多處事實錯誤。
一個網站十萬頁上線才發現Google兩個月沒讀取網址清單
一個網站油價停在三週前、行政區頁全部404,十六個檔案裡的不實審閱字句換成誠實版本,另一個網站則發現Google自七月底就沒再讀取網址清單,決定暫緩擴張規模。
Vercel 帳戶被清空,十萬頁上線,三場事故同一天
網域搬家一度讓信箱斷線40分鐘,十個網站的站內連結整天404,搶救回來的AI商學院內容也一度被程式吃掉大半;同一天一個網站十萬頁公司資料正式公開。
一篇文章消失牽出系統互蓋,17個舊站同日復活
一篇日文文章因為程式庫切換而消失,牽出全面清查:142個網域還掛在已刪除的舊平台上,當天修好17個站,天氣與藥品兩個排程也被抓到靜默沒有真的更新。
兩度憑證失敗後完成雲端遷移
一個網站在兩次憑證失敗與一次上線前的緊急喊停後,完成搬遷Google Cloud;同一天每日五篇文章制度擴大到21個資料站,另一個網站資料比對也自行攔下兩個潛在錯誤。