l

2010年6月2日 星期三

還少一本書:Release It! Design and Deploy Production-Ready Software

06/02 20:45~22:11

Teddy 寫了 『600 多個 bugs 要怎麼修? 』之後,突然想到之前看過的一本書:『Release It! Design and Deploy Production-Ready Software』,看書名就知道這本書的目的,的確,作者 Michael T. Nygard 也沒有唬爛讀者,這的的確確是一本值得掏錢出來買的好書。

想當年 Teddy 退伍後投入軟體業,也是很努力的開發了幾個系統,但是說實話一路上跌跌撞撞,總是有 de 不完的 bugs。為什麼開發出來的軟體就是無法有很好的品質?當然原因很多,資源不足是主要的原因,開發時程訂的很 趕,也沒有專屬的測試人員,因此軟體普遍缺少完整的測試。不知道如何寫出穩定的軟體則是另外一個原因,其中包含 coding 功力不夠,exception handling 處理不良(有在處理嗎?),軟體工程的 practices 做的不夠紮實等等。

正所謂『滿天全金條,麥殺 (要抓) 沒半條』,就算是 看了一堆軟體開發的書還是不知道怎樣才能做出 Production-Ready Software,此時這本書便可派上用場。

這本書介紹了許多關於 stabilitycapacity 的 patterns 與 anti-patterns。看到 patterns 這個字不要被嚇一跳,本書 patterns 寫作的方式以文字說明為主,簡單易懂有又深度(深入淺出)。在這邊舉幾段書中的敘述給鄉民們參考一下:

Chapter 5: Stability Patterns

5.1 Use Timeouts

The Timeouts and Fail Fast patterns both address latency problems. The Timeouts pattern is useful when you need to protect your system from someone else's failure. Fail Fast is useful when you need to report why you won't be able to process some transaction. Fail Fast applies to incoming requests, whereas the Timeouts pattern applies primarily to outbound requests. They're two sides of the same coin.

這兩個 patterns Teddy 在開發系統的時候經常用到。先講 Fail Fast,這個 pattern 其實就是 Teddy 之前介紹過的 Exception Handling Robustness Level 裡面的 RL1 (robustness level 1)。意思是說,發生任何的 exceptions 都要立即回報,不可暗槓例外(do not ignore exceptions)。所以 Fail Fast 是有良心的 callee 要保護 caller ,確保當 callee 有問題時會告知 caller,不會像有些人偷偷打一發魚雷然後又說不是自己幹的(發生 exception 又不承認,要找 bug 就很難了)。Timeouts 則是 caller 要保護自己,不會因為 callee 沒有回應而把自己給搞掛了。Timeouts 這個機制日常生活中人人都會用到,例如,鄉民們打電話給別人,如果對方沒接,總不可能讓電話一直響下去吧。一般正常人可能響個七~八聲沒人接就會把電話掛掉了。這個『電話響多久沒接就掛掉』就是 Timeouts,保護打電話的人不會一直空等。

鄉民甲:那我寫程式都沒有用到 Timeouts 耶。

Teddy:如果是寫單機版的程式,可能比較少用到 Timeouts。但是,只要寫網路應用程式或是資料庫程式就會經常遇到。例如,建立網路或資料庫連線可能會失敗,如果不設 Timeouts 那麼程式可能會一直等下去,讓 users 以為系統當機。執行外部程式則是另外一個例子,這些外部程式可能會『卡住』,如果不設 Timeouts 整個系統也會跟著卡住。但是設 Timeouts 也是有學問的,要長到可以讓大部分的工作都來的及完成,又不能長到讓 user 覺的等太久而產生系統當機的錯覺。

***

5.2 Circuit Breaker

... It is a component designed to fail first, thereby controlling the overall failure mode.

... More abstractly, the circuit breaker exists to allow one subsystem (an electrical circuit) to fail (excessive current draw, possibly from a short-circuit) without destroying the entire system (the house). Furthermore, once the danger has passed, the circuit breaker can be reset to restore full function to the system.

You can apply the same technique to software by wrapping dangerous operations with a component that can circumvent calls when the system is not healthy. This differs from retries, in that circuit breakers exist to prevent operations rather than reexecute them.

Circuit breakers are a way to automatically degrade functionality when the system is under stress.

上面的說明應該很清楚了,直接舉個例子。假設鄉民們寫了一隻網路程式,可以接受 client 透過 TCP/IP 連線。如果同時間有大量的 requests 連過來(生意太好或是被駭客攻擊)而你的程式沒有做任何保護,那麼可能會因為建了太多連線導致資源不足而讓程式當掉或是反應緩慢到接近當掉,總之就是無法提供任何服務。如果套用 Circuit Breaker pattern,那麼當同時連線數目到達某一個數量之後,就暫時把接受新連線的功能關閉,等系統的負載降到某種程度之後再重新開啟接受新連線的功能。這樣做當然會導致系統服務水準降低,但是至少可以讓系統提供某種程度的服務,至少不會接近死當。正所謂『好死不如賴活著』,就是這個道理。

其他更多更精彩的內容就請鄉民們自己去發掘了。

***

友藏內心獨白:有時候要看了好幾本爛書,才會看到一本真正的好書。

1 則留言:

  1. 就像我現在覺得約耳趣談軟體比較能解決我的問題 XD

    回覆刪除