如果你需要設計一套規模可伸縮且具有高可用性的容錯系統,那么 Erlang/OTP 平臺值得你去深入了解,因為其適用領域廣闊、技術積累深厚,具備豐富功能的同時又貫徹了高度一致的設計思想。這本實踐指南展示了使用 Erlang 編程語言及其 OTP 框架(其中包含許多可復用的庫、工具和設計原則等),你將可以基于簡單的理念開發出復雜的商業級別的系統,并具備故障免疫能力。
* 探索 OTP 的基石:Erlang 編程語言、相關工具、可復用的庫集合,以及相關抽象理念與設計規則。
* 深入 OTP 實現可復用性的核心機制:各類進程行為模式內部涉及的 Erlang 進程結構。
* 理解 OTP 中進程行為模式是如何為客戶端-服務器結構、有限狀態機模式、事件處理、運行時、代碼集成等功能提供支持的。
* 編寫自己的進程行為模式以及特殊進程。* 使用 OTP 提供的工具、技術與架構來處理部署、監視和運維等。
譯者序
這是一本值得每個 Erlang程序員閱讀的好書,因為它深入透徹地講解了 Erlang程序員進階過程中最為關鍵的一環對 OTP框架的深入理解。
眾所周知,與一些火熱的流行語言相比, Erlang書籍一直以來數量不多,并且其中大多數以介紹入門級內容為主,意在引起讀者的興趣。盡管這些書籍也各具特色,不少堪稱佳作,但對于真正需要從事 Erlang進行開發的程序員來說,僅僅了解基本內容是遠遠不夠的。因此長期以來,要想進一步學習,就需要自己在 Erlang文檔中摸索。客觀地說, Erlang擁有非常完善的文檔,并且其源代碼很容易讀懂,因此只要有好奇心,你可以深入了解任何你感興趣的細節。但是,了解細節是一回事,了解細節背后的設計動機又是另一回事。從這個角度來看,文檔與源代碼雖然將核心機制毫無保留地呈現在我們面前,但仍然有所欠缺。欠缺的是一條線索,一條能夠貫穿系統設計中重大決策背后動機的線索。而本書的出版,終于補上了這缺失的一環。
我想強調,本書對于 OTP的講解,并非局限于講解其用法如果真是如此,那么閱讀文檔便足夠而是更注重其原理。此原理即是指其工作流程,更是指其設計動機。正因為如此,本書的內容才顯得獨特而可貴。具體來說,本書的前半部分,在作者的帶領下,讀者可跟隨其指導重新實現 OTP中最核心的構成要件。這一過程并非平庸的代碼羅列然后逐句解讀,而是首先從背景出發,遵循一定的設計理念,先帶領讀者設計出一個小型的模型,其雖然看似簡陋,但已能夠實現基本功能,然后進一步指出其不足,并將其改進為符合 OTP理念的實現。與 OTP內部真正的實現相比,顯然讀者的實現依然是簡陋的,但是卻深刻地反映了真實系統運作時的核心原理。倘若讀者有心,能夠認真跟著作者的指點完成整個過程,那么不僅能夠輕松理解這些 OTP框架中核心構件的使用方法,知其然;并且能夠明白其背后的工作原理,知其所以然。
完整介紹完 OTP后,本書的篇幅已過大半。我想,本書內容即使自此戛然而止,也不愧列入經典之列了。但兩位作者 Francesco和 Steve卻選擇更進一步,帶領讀者探索更深的主題。于是在第 11章,我們不僅可學習到 OTP系統的核心設計原則,并且還跟著作者一步步手工完成了 OTP發行包(Release)的制作。這一章我特別喜歡。因為我和很多讀者一樣,能使用 rebar3之類的工具自動完成發行包制作,但對其中過程卻不甚清楚。作者為什么要花費很長的篇幅介紹如何手工制作發行包呢?因為通過這個過程,讀者能夠深入理解 Erlang系統的構成,及其啟動過程。如果不了解這些內容,就無法理解和應對一些比較棘手的啟動階段的問題,同時也喪失了利用這個過程完成一些定制化能力的機會。并且,理解這些內容,對于那些想進一步探索 Erlang核心機制的硬核程序員來說,也極有幫助。這一章我個人認為是本書中特別重要的一章,并且實踐性極強,建議讀者跟隨作者的指引一步步完成實驗。
而第 12章,更進一步,向讀者介紹了如何進行系統升級。我相信很多人都聽過 Erlang支持熱更新,但是對它的認識僅限于模塊級的熱更新。你想知道如何升級 application,甚至升級整個 Erlang虛擬機嗎?事實上一點也不難,作者將告訴你最佳做法,你不用擔心升級時 application間的依賴、數據庫模式變化等諸多問題。一切答案都在這里。剩下的第 13章到第 16章同樣不容錯過。分別介紹了分布式系統架構方案、容錯性設計、規模伸縮方法,以及監視與搶救性支持等內容。
每一章都很精彩,我很想向讀者一一介紹,但我想更好的做法是讓讀者自己去領略吧。在這篇譯者序里我就不劇透了。
交流與反饋
我在 GitHub上建立了一個項目,如果你希望與我或者其他讀者交流,這是一個不錯的方式。其中還整理了一些與本書相關的資料(代碼、勘誤和相關文檔等)鏈接,方便查閱。這個項目會長期維護,歡迎隨時來訪,共同交流。
https://github.com/Jianru-Lin/scalabilitywitherlangotp
回顧與感謝
作為一篇譯者序來說,感謝部分一般的做法是優雅而禮貌的寥寥數語帶過即可。少則三兩句,多則一兩段足矣。先是感謝編輯,然后是感謝家人和朋友。這樣做或許沒有問題,但我仔細想想倘若多年后自己翻起本書,卻看不到自己當時真正想說的話,會很遺憾吧。所以還是想把自己真實的想法寫下來。
兩年前張春雨老師找到我,問我有沒有興趣翻譯一本 Erlang的書。我當然開心的答應了,因為我很喜歡 Erlang。但由于個人業余時間有限,最終花了兩年時間才完成。這期間并非一帆風順,有很多波折,主要是我個人工作環境發生變化,業余時間有時候很緊張,而且身體有一段時間也有一些不適,綜合各種因素導致翻譯的進度時好時壞。拖稿也從偶爾有之,到家常便飯了。編輯從時不時查閱進度,到不斷的催稿。
剛開始,也是客氣的催稿。我則客氣的回應。但是次數多了,有時候確實給編輯著急得不行:這都周三了,說好周末交的呢?,最遲這周五,不能再拖了!,我也壓力山大,只能趕緊抽時間處理,有時候一再拖延,真的是很不好意思回編輯的微信了。于是有林老師,干什么去了?弄完了嗎,稿子什么時候能給,急死了!。剛開始是張春雨老師催,后來和劉舫老師兩位一起交替催,催得厲害了,有一天,劉舫編輯自己笑著打趣說:天天追殺啊。大家都笑了,我也笑了。
我記得很多次,我白天工作抽不出時間,只能深夜處理。于是把稿子發給劉舫編輯的時候,已經是凌晨四五點了。可是令我驚奇的是,經常很快就收到了回復。聊了兩句后,我準備休息,心里嘀咕著,劉舫老師現在還醒著?深夜交稿尚且如此,周末和節假日更別說了。想想自己尚且有周末休息,可是編輯卻一直處于工作狀態,心里覺得自己的辛苦其實和他們還是比不了。所以對于催稿這件事,也不能說是編輯施壓譯者,其實編輯同樣不容易。
說起來還鬧過一個笑話,因為我偶爾會去北京,于是也會想見見張春雨和劉舫老師。于是有一次就和劉舫老師提起見面吃飯的事,當時文字交談過程中感覺劉舫老師似乎不太方便。后來才知道原來劉舫老師是女編輯!我和人家溝通了一段時間連對方性別都沒搞清楚,真是十分尷尬。但是這也不能完全怪我,因為每次我發的稿件劉舫老師總是細細閱讀后給出很多專業的修改意見,讓我覺得很厲害,潛移默化習慣性以為是男同胞。怪只能怪自己有錯誤的刻板印象。而且后來發現很多技術書籍背后的編輯都是女性,心里就更驚訝和欽佩了。
其實張春雨老師聯系我之前,我早就知道他了,因為我讀過的不少優秀引進書籍的策劃編輯都是他,我書架上的《游戲引擎架構》和《 Clojure編程》就是,(后者的責任編輯還是劉舫老師),這些書都屬高水準作品。而其中每一本的譯者序里都有感謝張春雨老師的話語,這就是為什么我對他有印象的原因。提到這一點,張春雨老師幽默的開玩笑說呵呵,他們沒有感謝我,是我事后加進去的。把我和劉舫老師都逗樂了。
好吧,不管怎么說本書終于譯完了。我寫了這么長的一段,其實只是希望下次您看到書籍時,不僅能注意到作者和譯者的名字,也應當留意編輯們的名字。作為譯者,我可以留下一些文字。但作為編輯,就很少讓讀者意識到他們幸苦的付出了。所以,感謝張春雨老師和劉舫老師,你們幸苦了。
另外,要特別感謝我的妻子,是你一直在催稿,催得比編輯還緊(二位編輯萬萬沒想到吧?其實你們有個不花錢的手下天天跟著我,我逃得過你們卻逃不過她),所以現在終
于完成了,而不是再多三個月。當然,當我完成這一切,也是你比我還要開心。說起來我還欠你一條比目魚,咱們說好了完成后就買一條嘗嘗的。你還說,很期待書印刷出來后,捧在手里的感覺,你要看看我在里面是怎么感謝你的。仔細想想這些年我做到的每一件事情背后其實都離不開你的支持,但我覺得這還不夠,我們還要一起再翻譯更多書,一起完成更多想做的事,一起去更多想去的地方。我寫下這些文字的時候你就躺在我身后,不亦樂乎的玩著手機。我沒有讓你看到我寫的內容,不過我猜你看到這段的時候一定會高興的。因為我也是。
最后,感謝我的父母和家人,尤其是保慈林女士、保慈芬女士、張紹光先生,是你們令我能接受好的教育,并教會我勇敢追求渴望的人生。而我的丈母娘在我工作繁忙期間,生活上給我很多的關照,減輕了我的很多負擔,為我節約了很多時間,對交稿功不可沒,我心里也很感激。
說得有些冗長,深感抱歉,但這些都是我的真實想法。因此我想即使再過很多年,讀起這段文字還是會很快樂。我很滿足。
林建入 2018年 5月 6日深夜于海口
序言
本書為你提供的,是一名自 1996 年從 R1 版便開始接觸 Erlang的愛好者,鉆研十多年后終于成長為一位分布式系統專家,在這一過程中所獲得的寶貴知識和經驗,讓你明白為何 Erlang/OTP能夠使你更容易地專注應對系統開發中那些真正的挑戰。
通過描述如何構建 OTP行為模式(behavior)以及為什么需要 OTP行為模式,我們向你展示了如何使用它們構建獨立節點。這就是最初我們向 OReilly提供的草案,內容僅限于此。但是在編寫本書時,我們決定將內容更進一步,記錄下我們的實踐經驗、設計決策過程和架構分布式系統時常見的一些問題。通過我們所做的這一系列設計選擇和折中,這些模式為我們提供了 Erlang/OTP眾所周知的可伸縮性、可靠性和可用性。與流行的觀點相反,這一切并非魔法般地開箱即得的,但獲得它們確實比其他任何非語義級別模擬 Erlang 的,或者不是運行在 BEAM 虛擬機上的編程語言要容易得多。
Francesco:為什么寫這本書
有人曾告訴我,寫書有點像生孩子。一旦你寫完一本書,拿到紙質圖書的那一刻,腦子里有的只是興奮和激動,而曾經付出的艱辛將統統被忘掉,只渴望著趕快開始寫另一本。自從 2009 年 6 月首次拿到紙質書以來,我一直有編寫 Erlang Programming(OReilly)續作的打算。在我開始這個項目時,我還沒有自己的孩子,但最終這一項目花了如此長的時間以至于我的第二個孩子都已經快出生了。美好的事物值得我們等待,誰說不是呢?
與第一本書一樣,本書是圍繞我在 Erlang Solutions公司所做的 OTP培訓材料中的示例編寫的,我將使用這些例子時我的講解和教學過程轉化為文字。每當完成一章后,我都會回顧并確保那些學生較難理解的部分我的講解是清晰的。最好的學生通常會問的那些問題最終被放到了補充材料部分,而篇幅較長的章則被分解成一些較短小的章。原本一切都很順利,直到我們到達第 11章和第 12 章,因為發行包制作和軟件升級沒有一種統一的方法,而是存在許多種工具。有些工具需要集成到客戶的構建和發布過程中,而其他一些則是開箱即用的。還有一些已無法使用。對于任何想要理解系統的發行包制作和軟件升級包括其幕后工作原理的人,我們希望這兩章成為他們的終極指南。此外,如果你必須對現有工具進行故障排除或編寫自己的工具,其中還介紹了你所需要了解的內容。
但真正的麻煩從第 13 章才開始。由于沒有任何示例和培訓材料,我發現自己必須將頭腦中的內容形式化,將構建 Erlang/OTP系統時所采取的方法落實為文檔,并嘗試將其與分布式計算理論結合起來。最終第 13 章變成了 4個章節,并且花了寫出本書前 10章那么長的時間才完成。對于那些購買了早期訪問(early access)的讀者,我希望沒有辜負你們的等待。對于那些明智地等我們寫完才購買的朋友,希望你們喜歡這些內容!
Steve:為什么寫這本書
我第一次發現 Erlang/OTP是在 2006 年,當時我正在研究如何能更快、更便宜、更好地開發企業集成軟件。無論我從哪個方面考察,Erlang/OTP都明顯優于我和我的同事當時一直使用的 C 和 Java 語言。2007 年,我加入了一家新公司,開始在商業產品中使用 Erlang/OTP,事實證明,我之前考察所發現的一切優勢都是真的。我教一些同事使用了這種語言,不久后,我們開發的軟件比其他大多數人開發的都更強大、更可靠、更容易演進,并且能更快地投入生產環境,甚至與人員規模大得多的 C 團隊相比優勢依然明顯。直到今天,我仍然完全信賴 Erlang/OTP在實踐中表現出的令人印象深刻的高效性。
多年來我發表了不少技術資料,而我的目標讀者一直都是像我這樣的其他從業者。這本書也不例外。在前面的 12 章中,我們提供了許多深入的實踐性細節,使開發人員能夠充分理解 OTP的基本設計原則。在這些細節中包含了大量極具實用價值的知識各類模塊、函數和方案等它們將為你的日常設計、開發和調試工作節省大量時間和精力。在最后的 4章中,我們將轉變方向,聚焦于宏觀的層面,探討可伸縮分布式應用在開發、部署和運行時涉及的各種權衡取舍。由于與分布式系統、容錯和 DevOps相關的知識、方案和需考慮的權衡數量著實龐大,所以要想將這些章節簡潔地寫出來難度可想而知,但我相信本書為此達到了適當的平衡,既為讀者提供了大量好的建議,同時又能避免讀者迷失其中。
我希望這本書能幫助讀者提高所開發的軟件和系統的質量及效用。
本書的讀者對象
本書的目標受眾主要針對 Erlang 和 Elixir 開發人員和架構師已經完整閱讀過一本以上入門書籍,并準備將知識提升到一個新的水平的人。這不是一本帶你入門的初等水平的書籍,而是一本涵蓋了許多其他書籍未涉及的高級內容、讓你遠超同行水平的書。其中第 3 章至第 12 章存在依賴關系,應該順序閱讀,第 13 章至第 16章也是如此。如果你不需要回顧 Erlang 初級知識,可以跳過第 2 章。
如何閱讀本書
本書中的內容兼容 Erlang 18.2。書中涉及的絕大部分功能同樣適用于先前版本的 Erlang;針對不適用的功能在書中均有指出。對于未來版本的不兼容性雖然在寫書時尚不可知,但將會在本書的勘誤頁面上進行詳細說明,并修復本書 GitHub倉庫中的對應代碼。我們鼓勵你從我們的 GitHub倉庫下載本書的示例代碼,并親自運行以更好地理解相關知識。
致謝
撰寫本書是一個漫長的旅程。在進行這項工作時,我們得到了許多優秀人士的幫助。編輯 Andy Oram給予了我們無數的想法和建議,耐心地指導我們,給予我們反饋,并且不斷鼓勵我們。 Andy,謝謝你,沒有你,我們無法完成此書! Simon Thompson Erlang Programming一書的合著者幫助了本書的構思和起草,并為第 2章奠定了基礎。非常感謝 Robert Virding貢獻的一些例子。我們還得到了很多讀者、審稿人、貢獻者的幫助,為我們提供了許多反饋,有了這些,我們才能讓每一章的內容充實。在此我們列出他們的姓名,并忐忑地希望沒有遺漏任何一位: Richard Ben Aleya、Roberto Aloi、Jesper Louis Andersen、Bob Balance、Eva Bihari、Martin Bodocky、Natalia Chechina、Jean-Fran.ois Cloutier、Richard Croucher、ViktóriaF.rd.s、Heinz Gies、 JoacimHalén、Fred Hebert、Csaba Hoch、Torben Hoffmann、Bob Ippolito、Aman Kohli、 Jan Willem Luiten、Jay Nelson、Robby Raschke、Andrzej .liwa、David Smith、Sam Tavakoli、Premanand Thangamani、Jan Uhlig、John Warwick、David Welton、Ulf Wiger和 Alexander Yong。如果我們在名單中遺漏了您,我們真誠地向您道歉!給我們發一封電子郵件,我們會將您添加進去。對 Erlang Solutions 職員中那些閱讀了本書早期撰寫過程中的手稿,以及其他早期為本書提供勘誤的人,我們必須大聲地向你們表示感謝。此外還要特別感謝所有通過社交媒體渠道鼓勵過我們的人,特別是其他作者。你知道我說的就是你們!最后但同樣重要的一點是,感謝 OReilly的制作、營銷和會議團隊,不斷提醒我們只要尚未付印工作就不算結束。我們非常感謝你們的支持!