“軟件教父”又開始整理模式了!
Martin Fowler是誰?
我在之前的文章中寫過,他是《重構(gòu)》、《分析模式》、《企業(yè)應(yīng)用架構(gòu)模式》、《領(lǐng)域特定語言》等一系列知名書籍的作者,他很少談?wù)摬僮飨到y(tǒng),數(shù)據(jù)庫,網(wǎng)絡(luò)這些底層的東西,也很少聽他談什么高并發(fā),海量用戶, 他也沒有開發(fā)過什么知名軟件,但是卻被奉為軟件開發(fā)的“教父”。
如果把軟件分層的話,他其實(shí)生活在最上層:
這一層擠著很多程序員,因?yàn)樵酵聦?,路越難走。必須得能耐得住寂寞,經(jīng)得起誘惑,對某個領(lǐng)域有著極為精深的研究才可以。
但是Martin Fowler在應(yīng)用層卻能呼風(fēng)喚雨,因?yàn)樗邆湟粋€特殊的能力:擅長把一些軟件開發(fā)實(shí)踐總結(jié)成“概念”。
很明顯,這需要極強(qiáng)的抽象能力。
Martin Fowler最為知名的作品可能就是《重構(gòu)》,他把軟件編程中各種修改代碼的方法抽象、總結(jié)、命名,影響了全世界每一個開發(fā)人員。
他還有一本書叫《企業(yè)應(yīng)用架構(gòu)模式》, Martin Fowler把企業(yè)應(yīng)用開發(fā)中的一些最佳實(shí)踐分門別類地總結(jié)了出來。
比如講領(lǐng)域邏輯模式的“事務(wù)腳本”,“表模塊”,“領(lǐng)域模型”,“Service Layer” 等。
講ORM的“單表繼承”,“類表繼承”,“活動記錄”等。
Martin Fowler 絕對是在應(yīng)用層開發(fā)的程序員的榜樣!
前天在瀏覽Martin Fowler的個人網(wǎng)站(https://martinfowler.com/)時,發(fā)現(xiàn)了這么一個寶貝:“分布式系統(tǒng)模式”(Patterns of Distributed Systems)。
我不由得心頭一喜:看來Martin Fowler沒閑著,又開始整理模式了,這一次更加宏觀,直接進(jìn)入了分布式系統(tǒng)!
但仔細(xì)一看,略有失望,不是Martin Fowler親自操刀的!是一位叫做Unmesh Joshi 的ThoughtWorks顧問寫的,Martin Fowler給了一些模式方面的指導(dǎo)和幫助。
這兩天看了一下,我覺得質(zhì)量還是挺高的,比如開篇先講了分布式系統(tǒng)的幾個通用問題:
- 進(jìn)程崩潰
- 網(wǎng)絡(luò)延遲
- 進(jìn)程暫停
- 非同步的時鐘
進(jìn)而引出分布式系統(tǒng)的模式是如何解決這些問題的 。
比如非常經(jīng)典的Write-Ahead Log 模式,可以用來解決進(jìn)程崩潰時數(shù)據(jù)的持久化問題:
先把數(shù)據(jù)當(dāng)作Command放入持久化的日志文件中,這樣即使KVStore進(jìn)程崩潰,在重啟以后依然可以從日志中恢復(fù)數(shù)據(jù)。
人家很清楚程序員的交流語言是代碼, 所以馬上給出了簡單的代碼片段來幫助理解細(xì)節(jié),真是很貼心。
- class KVStore…
- public KVStore(Config config) {
- this.config = config;
- this.wal = WriteAheadLog.openWAL(config);
- this.applyLog();
- }
- public void applyLog() {
- List<WALEntry> walEntries = wal.readAll();
- applyEntries(walEntries);
- }
- private void applyEntries(List<WALEntry> walEntries) {
- for (WALEntry walEntry : walEntries) {
- Command command = deserialize(walEntry);
- if (command instanceof SetValueCommand) {
- SetValueCommand setValueCommand = (SetValueCommand)command;
- kv.put(setValueCommand.key, setValueCommand.value);
- }
- }
- }
- public void initialiseFromSnapshot(SnapShot snapShot) {
- kv.putAll(snapShot.deserializeState());
- }
現(xiàn)在已經(jīng)整理出來的分布式系統(tǒng)模式有這些:
為什么向大家推薦這個資料呢?是因?yàn)榫W(wǎng)上有很多分布式理論的文章,干巴巴的,看不了一頁就想放棄。
網(wǎng)上也有很多源碼分析的文章,專注于貼代碼,糾纏于細(xì)節(jié),讓人云里霧里。
Unmesh Joshi的分布式系統(tǒng)模式則是個很好的平衡:既有理論,又有代碼細(xì)節(jié)。
如果你是一個剛?cè)胄械男率?,看這些東西可能有些吃力,因?yàn)樾枰蟹植际较到y(tǒng)的基礎(chǔ),不妨先收藏,等待以后再看。
如果是一個經(jīng)驗(yàn)豐富的老手,我強(qiáng)烈推薦你去看一看,觀摩下這些大牛們是怎么從各種復(fù)雜的場景中抽取出通用的模式的,絕對受益非淺, 你可能有這樣的感覺:這種工作我怎么就沒想到呢?
當(dāng)然,這是英文的材料, 會有一定的障礙,不過你看了就知道,并沒有用什么高級的詞匯,我列幾句大家感受感受:
Processes can crash at any time. Either due to hardware faults or software faults. There are numerous ways in which a process can crash.
It can be taken down for routine maintenance by system administrators.
It can be killed doing some file IO because the disk is full and the exception is not properly handled.
并不難,對吧?嘗試看一下吧,閱讀英文資料也是一項(xiàng)重要的技能。
鏈接在此:https://martinfowler.com/articles/patterns-of-distributed-systems/
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】