閒談軟體設計:Deploy on Friday

閱讀時間約 7 分鐘

前言

之前看到同溫層有些人在討論 Deploy on Friday 這件事,本來沒想跟風,偏偏昨晚要下班時,公司設定的 alert 響起,而且還是非常重大的那一種,只好把背包放下,跟其他同事協助將被灌爆的客服。老實說,這不是我們上版引起的,而是我們使用的 Firebase Real-time Database 不知道哪根蔥不對,竟然在周五晚上,餐廳最忙最需要我們系統的時候,搬移我們的資料庫到別台機器上,餐廳非常依賴的資料即時同步功能瞬間就異常大概半小時,於是想寫一下關於 Deploy on Friday 的想法。

當晚客服如預期般接到很多抱怨,我們也發 ticket 詢問 Google,得到的答覆是:原本 host 我們資料庫的那台機器,health check 出現異常,於是啟動了自動搬移機制 (淚)。話說,這算是 Firebase Deploy on Friday 嗎?

風險控管

首先,我得說,我認為 devOps 是一種不分開發維運、打破籓籬、持續改善與盡早交付的精神。所以我們做很多自動化的測試 (不管是單元測試、整合測試、壓力測試都做)、自動化的布署、任何能讓上線比較沒壓力及降低風險的事。終極目標就是不管是周五也好,周末也罷,只要想 Deploy,隨時都能 Deploy。

但什麼時候上線,還是回歸到風險控管吧。無論花了多少資源進行測試,都無法保證一個新版本是沒有 bug 的,所以新版本上線後還是有一定的機率會出錯,對!不管是一個星期的哪一天,機率都是一樣的,所以哪一天上版都可能會出錯,但出錯造成的損失就不見得一樣。

不同的產業,不同的服務類型,就有不同的損失分布,像是 Facebook,壞了對我來說不痛不癢,不用它幾小時不是什麼大問題,這類對多數人來說不是 mission critical 的服務,哪天上新版損失是差不多的。但是像我一開始提到的,周五晚上以及周末,是餐廳業績最好也是最忙碌的時間,我們在周五上新版若出錯,對餐廳所造成的營業損失肯定是高於平日的,這時候還會選擇周五上新版?

當然,若已知上新版本的獲利遠大於損失,那就上啊!這還有什麼好說的。(笑)

降低損失

如果說機率是一樣的,且已知某天上版造成損失是高的,是否有方式降低損失呢?這命題遠比為何不能在周五上版來的正向許多。

例如,我們的退版速度能多快?需要很複雜的步驟才能退版嗎?畢竟不是所有的情況都能夠快速地退版,像是 iOS app 或牽扯到資料庫 schema 變動都可能無法很快速地退版。iOS app 從送審到等待通過,這段時間的操控權不在開發者手上,甚至遇到聖誕長假,Apple 是不審理 app 新版本上架的 (我沒在聖誕長假期間送過緊急審查,不確定審不審),這都會影響是否要上新版本的決策。如果退版只是一個按鈕,或是能在幾分鐘內就完成,上新版或許就不是太大的問題,就看這損失我們是否願意承擔。

或是上新版後,我們可以用 feature toggle 控制損害範圍,像是新功能只有少數的使用者才能夠使用,當新功能出錯時,也只有這些使用者會受影響,或是反過來用,當新功能出錯時,不用退版就能將這功能關閉,讓使用者回到舊版本繼續使用服務。例如 Apple 就階段性發布自動更新的機制,以 1%、2%、 5%、10%、20%、50%、100% 的比例推送自動更新,還能夠暫停發布。也就是說若 API 上版也能夠用同的方式管控,就能控制損害的程度。

raw-image

又或者是,調整系統架構,能讓上新版的影響範圍降到最小,我並不是在推崇 micro-service 架構或是什麼廠商的 serverless 方案,光是最基本的,系統架構模組化,讓修改的影響侷限在一個模組內,這樣就能夠大大降低上新版的風險,如果系統架構沒有好好的模組化,改一個東西或加一個新功能,動輒改上數十個檔案,我相信上版時心裡還是會怕怕的。

抱有持續不斷地改進的精神,努力降低上版的風險,最後,哪一天上版就僅僅是風險控管的問題了。

On-call? Or not on-call?

這個議題的另一個面向,很多人直指不想周末加班或 on-call,所以這題目可以更 general 一點,該不該在假日前上版,像是農曆新年連假、中秋連假、國慶連假,以我們的產品特性,我們都是較保守不上版,不是因為沒信心,而是找不到理由要在客戶最忙的時刻增加風險 (相較已穩定運行的舊版本)。

我曾在某年的最後一天,雖然那天放假,我仍跟老闆到某家在信義區的知名拉麵店,不是去吃拉麵,而是去查找為什麼平安夜那晚候位出單機的出單速度異常緩慢,說真的,這功能上線前我們也是做了不少的測試,他們剛開始用時,也曾在那邊站了數小時觀察使用情況,認為不會有問題,偏偏平安夜那晚有時候要 10 秒才出一張單。最後我們請店家不要使用 4G 分享器 (我相信很多人都有過跨年時手機訊號滿格卻沒有網路的情況),改使用獨立的 WIFI 就沒問題了。

我想說的是,當線上的系統出現問題,多數工程師還是願意犧牲自己的假日解決問題,但不代表當有不用加班的選擇時 (舊版本已穩定運行一段時間),卻要刻意拿石頭砸自己的腳 (放假前上新版本)。畢竟在上班日上新版,若出現問題,可以在上班日處理。

雖然有人提到,公司要有好的 on-call 機制,讓工程師更願意 on-call,像是提供加班費、補假、獎金等等。當我們在譴責公車公司讓司機疲勞駕駛時,卻又同時用這些機制鼓勵工程師加班?即便有這些獎勵,每個人的價值觀不同,也不是每個工程師都願意這樣砸自己的腳,我相信多數人不希望在帶小朋友去公園玩時,看到手機簡訊後跟小朋友說:

不好意思,爸爸昨天手賤,硬是要上新版本,但現在出了點問題,所以爸爸現在不能陪妳,得去公司處理點事情。

至於這樣的人多不多?這問題其實很簡單,在面試的時候只要問,您是否願意配合 on-call,即便有這麼多獎勵機制,我保證還是能夠刷掉一大票的人,即便是能力好的人也是有不願意配合的。這是價值觀選擇的問題,只靠獎勵機制說服不同世界的人是有難度的。

我倒覺得,應該要做的是平常多進行教育訓練,畢竟當系統越來越大,不是每個人都會參與所有的功能開發,當 on-call 時遇到不熟悉的系統功能,自然壓力會很大,透過這種方式,盡可能到減輕 on-call 時要面臨的壓力,會比較正向一點,像最近我們就辦了很多次 workshop,講解過去可能都是由資深人員處理的線上問題,讓其他人有機會可以處理。

總結

最後總結,針對這議題,從 devOps 的角度看,團隊應抱有持續不斷地改進的精神,努力降低上版的風險,最後,哪一天上版就僅僅是風險控管的問題了。風險控管除了考量到損失,當然還要考慮到團隊要怎麼 on-call,on-call 的資源夠不夠應付上版後的突發狀況,才能做出適當的決策。


後話

上面說這麼多,那我們有針對 Firebase Real-time Database 會無預警搬移機器這件事做什麼努力嗎?有的,像是之前用 shard,分散資料,讓單一 shard 影響的餐廳數減少。最近則是在進行架構調整,但由於 root cause 是非常底層的資料庫以及整個資料即時同步的機制,所以牽動到的範圍就非常大。不過搭配 feature toggle,我們架構調整的程式碼不是在一個獨立的分支上,而是一直持續不斷地回到主線上,能持續上線其它新功能而不受影響。目前正在 beta 環境上進行大規模的測試。改天有機會再來分享。

avatar-img
53會員
104內容數
這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Spirit的沙龍 的其他內容
這文章來自網友在 在 Medium 上的留言 (有人幫忙想題目也挺不錯的),問到:Singleton 對於好的架構來說是否能避免就避免呢?我簡單地回了一下我的想法 ,但 Singleton 其實很有趣,所以就寫篇文章來聊聊吧!
真的要符合 single responsibility,通常會得到很多很小的類別或是函式,各別完成一個小的功能,然後在某個地方被聚合起來完成一個使用案例 (use case),而不是一個很大的類別,包山包海,然後最後變成一個狀態超複雜,超級難測試的類別。
這是幾年來我對於軟體架構師的心路歷程,上述不保證讓你成為軟體架構師,但希望會對軟體工程師職涯有幫助。也希望台灣的軟體公司能稍微多注重一下軟體架構,甚至能像 91App 不只工程師團隊,還有軟體架構團隊。
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
長遠的角度來看,內部函式庫還是值得投資的公司資產,只是它需要時間、人力與管理才能做得好。若有不錯的內部函式庫也可以回饋給open-source社群,畢竟,現在開發軟體已經不太可能沒有用到任何open-source的東西。雖然說是將公司資產以 open-source 釋出,但換取的利益卻不見得是零。
整結來說,受到幾種語言的影響,我個人設計 API 時,除了合乎該語言的 convention、上述的穩定性及一致性外,大致還會注意幾點:語意清楚、相近的顆粒度、簡單的文件、讓程式能像文章般閱讀。
這文章來自網友在 在 Medium 上的留言 (有人幫忙想題目也挺不錯的),問到:Singleton 對於好的架構來說是否能避免就避免呢?我簡單地回了一下我的想法 ,但 Singleton 其實很有趣,所以就寫篇文章來聊聊吧!
真的要符合 single responsibility,通常會得到很多很小的類別或是函式,各別完成一個小的功能,然後在某個地方被聚合起來完成一個使用案例 (use case),而不是一個很大的類別,包山包海,然後最後變成一個狀態超複雜,超級難測試的類別。
這是幾年來我對於軟體架構師的心路歷程,上述不保證讓你成為軟體架構師,但希望會對軟體工程師職涯有幫助。也希望台灣的軟體公司能稍微多注重一下軟體架構,甚至能像 91App 不只工程師團隊,還有軟體架構團隊。
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
長遠的角度來看,內部函式庫還是值得投資的公司資產,只是它需要時間、人力與管理才能做得好。若有不錯的內部函式庫也可以回饋給open-source社群,畢竟,現在開發軟體已經不太可能沒有用到任何open-source的東西。雖然說是將公司資產以 open-source 釋出,但換取的利益卻不見得是零。
整結來說,受到幾種語言的影響,我個人設計 API 時,除了合乎該語言的 convention、上述的穩定性及一致性外,大致還會注意幾點:語意清楚、相近的顆粒度、簡單的文件、讓程式能像文章般閱讀。
你可能也想看
Google News 追蹤
Thumbnail
前篇內容提到說,async reset有著打出glitch的風險, 但除了glitch之外, 如果reset deassert的時間點不對的話可是造出大量metastable的data, 直接導致function fail, 至於assert的時間點因為是async reset,所以何時出發
Thumbnail
我們可能會有一種迷思,不管開發什麼系統,開發團隊都袛會有一種方式來工作。反正不管怎麼樣,系統最終也一定是能開發出來的。那麼選擇開發生命週期又跟我何干?本篇將會介紹專案經理應該如何為不同特性的專案選擇最合適的管理策略,即生命週期。
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
Thumbnail
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
Thumbnail
作為一個突然要加班到半夜的人(也許也有不用加班的可能,但拖拖沓沓思考人生不知不覺就到了現在),不得不取消今天晚上的chill chill聊聊,昏天暗地的時候發現還沒寫今天的五百字,趕快來補一下。 比恐懼更令人坐立難安的是沒有源頭的恐懼,今天我就經歷了這一切。我知道我自己做錯了一件事、做不好另一件事
如果是從零起建的機房,惟一的問題會是在於有沒有事先規劃好系統架構,以及建置的過程中,有沒有注意相關系統參數的調整。 這時,也只有上線時間要考慮而己。 如果是系統更新呢?那麻煩就多了,要顧慮使用者操作系統的時間,怎麼說呢?如果是月初財務室要進行財務報表製作,資訊室說要更新網路設備,然後所有作業停頓,
Thumbnail
資料庫之備份工作大都是自動執行,但是執行結果是否成功,需要安排人員去檢查,有時疏忽忘記確認作業,致備份工作失敗仍不知道,等到有一天需要回復舊有資料的場合時,才發現找不到過去某段期間的備份資料,造成無法彌補之後果。   2.    改善: 2.1 設計一執行檔,功能為打開備
Thumbnail
很朋友都說自己都還沒走在這路上根本就沒開始啊,根本沒感覺到會崩壞,只是感覺前方阻礙有如群山一般很難跨越。確實如此,DevOps這個文化到2024年,已經執行快8年,即使跨過萬重山,但每年又會多出更多的山來阻礙前進的道路。從工程角度來看,不外乎外面的世界變化越來越快,要面對挑戰更多,從人的角度來看之前
不論企業使用的伺服器和客戶端是使用何種作業系統,定期更新補丁是必不可少的。 這道理仿如真理,因為世界上還沒有一個作業系統是完全沒有漏洞的,只要有漏洞被發現,就要推出補丁,作為使用者的角色就得決定是否安裝。 筆者曾經和一些決策層交談,他們未必是IT業者,但也懂得補丁要越快更新越好。但其實這觀點並不
Thumbnail
《專案管理》這本書,這是本許多人推薦專案管理必讀的書。你知道身為專案經理需要具備什麼特質嗎?你真的知道專案管理是在做什麼嗎?主管朝令夕改其實不是故意惡整你,也不是他願意?
Thumbnail
前篇內容提到說,async reset有著打出glitch的風險, 但除了glitch之外, 如果reset deassert的時間點不對的話可是造出大量metastable的data, 直接導致function fail, 至於assert的時間點因為是async reset,所以何時出發
Thumbnail
我們可能會有一種迷思,不管開發什麼系統,開發團隊都袛會有一種方式來工作。反正不管怎麼樣,系統最終也一定是能開發出來的。那麼選擇開發生命週期又跟我何干?本篇將會介紹專案經理應該如何為不同特性的專案選擇最合適的管理策略,即生命週期。
Thumbnail
前年第一次藉公司機會,參加了DevOpsDay的活動。雖然devOps一詞各自表述,大多狀況還是偏向維運會遇到的技術為主,做為平時開發、跟使用者訪談需求的工作內容來說,參加聚會如果沒有一定的知識,對講者所提到的狀況比較難有共鳴...
Thumbnail
放鬆的週末,我與幾位同事決定提升我們的後端開發技巧,選擇了「日期範圍生成器」作為我們的小型實作。作為團隊中較有經驗的PHP工程師,我引領著團隊從基礎程式碼的撰寫開始,進而深入到物件導向的結構調整,最後提高程式可擴充性的挑戰。雖然過程中遇到不少困難,但我們通過不斷的討論和優化,最終成功克服了所有挑戰。
Thumbnail
作為一個突然要加班到半夜的人(也許也有不用加班的可能,但拖拖沓沓思考人生不知不覺就到了現在),不得不取消今天晚上的chill chill聊聊,昏天暗地的時候發現還沒寫今天的五百字,趕快來補一下。 比恐懼更令人坐立難安的是沒有源頭的恐懼,今天我就經歷了這一切。我知道我自己做錯了一件事、做不好另一件事
如果是從零起建的機房,惟一的問題會是在於有沒有事先規劃好系統架構,以及建置的過程中,有沒有注意相關系統參數的調整。 這時,也只有上線時間要考慮而己。 如果是系統更新呢?那麻煩就多了,要顧慮使用者操作系統的時間,怎麼說呢?如果是月初財務室要進行財務報表製作,資訊室說要更新網路設備,然後所有作業停頓,
Thumbnail
資料庫之備份工作大都是自動執行,但是執行結果是否成功,需要安排人員去檢查,有時疏忽忘記確認作業,致備份工作失敗仍不知道,等到有一天需要回復舊有資料的場合時,才發現找不到過去某段期間的備份資料,造成無法彌補之後果。   2.    改善: 2.1 設計一執行檔,功能為打開備
Thumbnail
很朋友都說自己都還沒走在這路上根本就沒開始啊,根本沒感覺到會崩壞,只是感覺前方阻礙有如群山一般很難跨越。確實如此,DevOps這個文化到2024年,已經執行快8年,即使跨過萬重山,但每年又會多出更多的山來阻礙前進的道路。從工程角度來看,不外乎外面的世界變化越來越快,要面對挑戰更多,從人的角度來看之前
不論企業使用的伺服器和客戶端是使用何種作業系統,定期更新補丁是必不可少的。 這道理仿如真理,因為世界上還沒有一個作業系統是完全沒有漏洞的,只要有漏洞被發現,就要推出補丁,作為使用者的角色就得決定是否安裝。 筆者曾經和一些決策層交談,他們未必是IT業者,但也懂得補丁要越快更新越好。但其實這觀點並不
Thumbnail
《專案管理》這本書,這是本許多人推薦專案管理必讀的書。你知道身為專案經理需要具備什麼特質嗎?你真的知道專案管理是在做什麼嗎?主管朝令夕改其實不是故意惡整你,也不是他願意?