如果你需要設(shè)計(jì)一套規(guī)模可伸縮且具有高可用性的容錯(cuò)系統(tǒng),那么 Erlang/OTP 平臺值得你去深入了解,因?yàn)槠溥m用領(lǐng)域廣闊、技術(shù)積累深厚,具備豐富功能的同時(shí)又貫徹了高度一致的設(shè)計(jì)思想。這本實(shí)踐指南展示了使用 Erlang 編程語言及其 OTP 框架(其中包含許多可復(fù)用的庫、工具和設(shè)計(jì)原則等),你將可以基于簡單的理念開發(fā)出復(fù)雜的商業(yè)級別的系統(tǒng),并具備故障免疫能力。
* 探索 OTP 的基石:Erlang 編程語言、相關(guān)工具、可復(fù)用的庫集合,以及相關(guān)抽象理念與設(shè)計(jì)規(guī)則。
* 深入 OTP 實(shí)現(xiàn)可復(fù)用性的核心機(jī)制:各類進(jìn)程行為模式內(nèi)部涉及的 Erlang 進(jìn)程結(jié)構(gòu)。
* 理解 OTP 中進(jìn)程行為模式是如何為客戶端-服務(wù)器結(jié)構(gòu)、有限狀態(tài)機(jī)模式、事件處理、運(yùn)行時(shí)、代碼集成等功能提供支持的。
* 編寫自己的進(jìn)程行為模式以及特殊進(jìn)程。* 使用 OTP 提供的工具、技術(shù)與架構(gòu)來處理部署、監(jiān)視和運(yùn)維等。
譯者序
這是一本值得每個(gè) Erlang程序員閱讀的好書,因?yàn)樗钊胪笍氐刂v解了 Erlang程序員進(jìn)階過程中最為關(guān)鍵的一環(huán)對 OTP框架的深入理解。
眾所周知,與一些火熱的流行語言相比, Erlang書籍一直以來數(shù)量不多,并且其中大多數(shù)以介紹入門級內(nèi)容為主,意在引起讀者的興趣。盡管這些書籍也各具特色,不少堪稱佳作,但對于真正需要從事 Erlang進(jìn)行開發(fā)的程序員來說,僅僅了解基本內(nèi)容是遠(yuǎn)遠(yuǎn)不夠的。因此長期以來,要想進(jìn)一步學(xué)習(xí),就需要自己在 Erlang文檔中摸索。客觀地說, Erlang擁有非常完善的文檔,并且其源代碼很容易讀懂,因此只要有好奇心,你可以深入了解任何你感興趣的細(xì)節(jié)。但是,了解細(xì)節(jié)是一回事,了解細(xì)節(jié)背后的設(shè)計(jì)動機(jī)又是另一回事。從這個(gè)角度來看,文檔與源代碼雖然將核心機(jī)制毫無保留地呈現(xiàn)在我們面前,但仍然有所欠缺。欠缺的是一條線索,一條能夠貫穿系統(tǒng)設(shè)計(jì)中重大決策背后動機(jī)的線索。而本書的出版,終于補(bǔ)上了這缺失的一環(huán)。
我想強(qiáng)調(diào),本書對于 OTP的講解,并非局限于講解其用法如果真是如此,那么閱讀文檔便足夠而是更注重其原理。此原理即是指其工作流程,更是指其設(shè)計(jì)動機(jī)。正因?yàn)槿绱耍緯膬?nèi)容才顯得獨(dú)特而可貴。具體來說,本書的前半部分,在作者的帶領(lǐng)下,讀者可跟隨其指導(dǎo)重新實(shí)現(xiàn) OTP中最核心的構(gòu)成要件。這一過程并非平庸的代碼羅列然后逐句解讀,而是首先從背景出發(fā),遵循一定的設(shè)計(jì)理念,先帶領(lǐng)讀者設(shè)計(jì)出一個(gè)小型的模型,其雖然看似簡陋,但已能夠?qū)崿F(xiàn)基本功能,然后進(jìn)一步指出其不足,并將其改進(jìn)為符合 OTP理念的實(shí)現(xiàn)。與 OTP內(nèi)部真正的實(shí)現(xiàn)相比,顯然讀者的實(shí)現(xiàn)依然是簡陋的,但是卻深刻地反映了真實(shí)系統(tǒng)運(yùn)作時(shí)的核心原理。倘若讀者有心,能夠認(rèn)真跟著作者的指點(diǎn)完成整個(gè)過程,那么不僅能夠輕松理解這些 OTP框架中核心構(gòu)件的使用方法,知其然;并且能夠明白其背后的工作原理,知其所以然。
完整介紹完 OTP后,本書的篇幅已過大半。我想,本書內(nèi)容即使自此戛然而止,也不愧列入經(jīng)典之列了。但兩位作者 Francesco和 Steve卻選擇更進(jìn)一步,帶領(lǐng)讀者探索更深的主題。于是在第 11章,我們不僅可學(xué)習(xí)到 OTP系統(tǒng)的核心設(shè)計(jì)原則,并且還跟著作者一步步手工完成了 OTP發(fā)行包(Release)的制作。這一章我特別喜歡。因?yàn)槲液秃芏嘧x者一樣,能使用 rebar3之類的工具自動完成發(fā)行包制作,但對其中過程卻不甚清楚。作者為什么要花費(fèi)很長的篇幅介紹如何手工制作發(fā)行包呢?因?yàn)橥ㄟ^這個(gè)過程,讀者能夠深入理解 Erlang系統(tǒng)的構(gòu)成,及其啟動過程。如果不了解這些內(nèi)容,就無法理解和應(yīng)對一些比較棘手的啟動階段的問題,同時(shí)也喪失了利用這個(gè)過程完成一些定制化能力的機(jī)會。并且,理解這些內(nèi)容,對于那些想進(jìn)一步探索 Erlang核心機(jī)制的硬核程序員來說,也極有幫助。這一章我個(gè)人認(rèn)為是本書中特別重要的一章,并且實(shí)踐性極強(qiáng),建議讀者跟隨作者的指引一步步完成實(shí)驗(yàn)。
而第 12章,更進(jìn)一步,向讀者介紹了如何進(jìn)行系統(tǒng)升級。我相信很多人都聽過 Erlang支持熱更新,但是對它的認(rèn)識僅限于模塊級的熱更新。你想知道如何升級 application,甚至升級整個(gè) Erlang虛擬機(jī)嗎?事實(shí)上一點(diǎn)也不難,作者將告訴你最佳做法,你不用擔(dān)心升級時(shí) application間的依賴、數(shù)據(jù)庫模式變化等諸多問題。一切答案都在這里。剩下的第 13章到第 16章同樣不容錯(cuò)過。分別介紹了分布式系統(tǒng)架構(gòu)方案、容錯(cuò)性設(shè)計(jì)、規(guī)模伸縮方法,以及監(jiān)視與搶救性支持等內(nèi)容。
每一章都很精彩,我很想向讀者一一介紹,但我想更好的做法是讓讀者自己去領(lǐng)略吧。在這篇譯者序里我就不劇透了。
交流與反饋
我在 GitHub上建立了一個(gè)項(xiàng)目,如果你希望與我或者其他讀者交流,這是一個(gè)不錯(cuò)的方式。其中還整理了一些與本書相關(guān)的資料(代碼、勘誤和相關(guān)文檔等)鏈接,方便查閱。這個(gè)項(xiàng)目會長期維護(hù),歡迎隨時(shí)來訪,共同交流。
https://github.com/Jianru-Lin/scalabilitywitherlangotp
回顧與感謝
作為一篇譯者序來說,感謝部分一般的做法是優(yōu)雅而禮貌的寥寥數(shù)語帶過即可。少則三兩句,多則一兩段足矣。先是感謝編輯,然后是感謝家人和朋友。這樣做或許沒有問題,但我仔細(xì)想想倘若多年后自己翻起本書,卻看不到自己當(dāng)時(shí)真正想說的話,會很遺憾吧。所以還是想把自己真實(shí)的想法寫下來。
兩年前張春雨老師找到我,問我有沒有興趣翻譯一本 Erlang的書。我當(dāng)然開心的答應(yīng)了,因?yàn)槲液芟矚g Erlang。但由于個(gè)人業(yè)余時(shí)間有限,最終花了兩年時(shí)間才完成。這期間并非一帆風(fēng)順,有很多波折,主要是我個(gè)人工作環(huán)境發(fā)生變化,業(yè)余時(shí)間有時(shí)候很緊張,而且身體有一段時(shí)間也有一些不適,綜合各種因素導(dǎo)致翻譯的進(jìn)度時(shí)好時(shí)壞。拖稿也從偶爾有之,到家常便飯了。編輯從時(shí)不時(shí)查閱進(jìn)度,到不斷的催稿。
剛開始,也是客氣的催稿。我則客氣的回應(yīng)。但是次數(shù)多了,有時(shí)候確實(shí)給編輯著急得不行:這都周三了,說好周末交的呢?,最遲這周五,不能再拖了!,我也壓力山大,只能趕緊抽時(shí)間處理,有時(shí)候一再拖延,真的是很不好意思回編輯的微信了。于是有林老師,干什么去了?弄完了嗎,稿子什么時(shí)候能給,急死了!。剛開始是張春雨老師催,后來和劉舫老師兩位一起交替催,催得厲害了,有一天,劉舫編輯自己笑著打趣說:天天追殺啊。大家都笑了,我也笑了。
我記得很多次,我白天工作抽不出時(shí)間,只能深夜處理。于是把稿子發(fā)給劉舫編輯的時(shí)候,已經(jīng)是凌晨四五點(diǎn)了。可是令我驚奇的是,經(jīng)常很快就收到了回復(fù)。聊了兩句后,我準(zhǔn)備休息,心里嘀咕著,劉舫老師現(xiàn)在還醒著?深夜交稿尚且如此,周末和節(jié)假日更別說了。想想自己尚且有周末休息,可是編輯卻一直處于工作狀態(tài),心里覺得自己的辛苦其實(shí)和他們還是比不了。所以對于催稿這件事,也不能說是編輯施壓譯者,其實(shí)編輯同樣不容易。
說起來還鬧過一個(gè)笑話,因?yàn)槲遗紶枙ケ本谑且矔胍娨姀埓河旰蛣Ⅳ忱蠋煛S谑怯幸淮尉秃蛣Ⅳ忱蠋熖崞鹨娒娉燥埖氖拢?dāng)時(shí)文字交談過程中感覺劉舫老師似乎不太方便。后來才知道原來劉舫老師是女編輯!我和人家溝通了一段時(shí)間連對方性別都沒搞清楚,真是十分尷尬。但是這也不能完全怪我,因?yàn)槊看挝野l(fā)的稿件劉舫老師總是細(xì)細(xì)閱讀后給出很多專業(yè)的修改意見,讓我覺得很厲害,潛移默化習(xí)慣性以為是男同胞。怪只能怪自己有錯(cuò)誤的刻板印象。而且后來發(fā)現(xiàn)很多技術(shù)書籍背后的編輯都是女性,心里就更驚訝和欽佩了。
其實(shí)張春雨老師聯(lián)系我之前,我早就知道他了,因?yàn)槲易x過的不少優(yōu)秀引進(jìn)書籍的策劃編輯都是他,我書架上的《游戲引擎架構(gòu)》和《 Clojure編程》就是,(后者的責(zé)任編輯還是劉舫老師),這些書都屬高水準(zhǔn)作品。而其中每一本的譯者序里都有感謝張春雨老師的話語,這就是為什么我對他有印象的原因。提到這一點(diǎn),張春雨老師幽默的開玩笑說呵呵,他們沒有感謝我,是我事后加進(jìn)去的。把我和劉舫老師都逗樂了。
好吧,不管怎么說本書終于譯完了。我寫了這么長的一段,其實(shí)只是希望下次您看到書籍時(shí),不僅能注意到作者和譯者的名字,也應(yīng)當(dāng)留意編輯們的名字。作為譯者,我可以留下一些文字。但作為編輯,就很少讓讀者意識到他們幸苦的付出了。所以,感謝張春雨老師和劉舫老師,你們幸苦了。
另外,要特別感謝我的妻子,是你一直在催稿,催得比編輯還緊(二位編輯萬萬沒想到吧?其實(shí)你們有個(gè)不花錢的手下天天跟著我,我逃得過你們卻逃不過她),所以現(xiàn)在終
于完成了,而不是再多三個(gè)月。當(dāng)然,當(dāng)我完成這一切,也是你比我還要開心。說起來我還欠你一條比目魚,咱們說好了完成后就買一條嘗嘗的。你還說,很期待書印刷出來后,捧在手里的感覺,你要看看我在里面是怎么感謝你的。仔細(xì)想想這些年我做到的每一件事情背后其實(shí)都離不開你的支持,但我覺得這還不夠,我們還要一起再翻譯更多書,一起完成更多想做的事,一起去更多想去的地方。我寫下這些文字的時(shí)候你就躺在我身后,不亦樂乎的玩著手機(jī)。我沒有讓你看到我寫的內(nèi)容,不過我猜你看到這段的時(shí)候一定會高興的。因?yàn)槲乙彩恰?/p>
最后,感謝我的父母和家人,尤其是保慈林女士、保慈芬女士、張紹光先生,是你們令我能接受好的教育,并教會我勇敢追求渴望的人生。而我的丈母娘在我工作繁忙期間,生活上給我很多的關(guān)照,減輕了我的很多負(fù)擔(dān),為我節(jié)約了很多時(shí)間,對交稿功不可沒,我心里也很感激。
說得有些冗長,深感抱歉,但這些都是我的真實(shí)想法。因此我想即使再過很多年,讀起這段文字還是會很快樂。我很滿足。
林建入 2018年 5月 6日深夜于海口
序言
本書為你提供的,是一名自 1996 年從 R1 版便開始接觸 Erlang的愛好者,鉆研十多年后終于成長為一位分布式系統(tǒng)專家,在這一過程中所獲得的寶貴知識和經(jīng)驗(yàn),讓你明白為何 Erlang/OTP能夠使你更容易地專注應(yīng)對系統(tǒng)開發(fā)中那些真正的挑戰(zhàn)。
通過描述如何構(gòu)建 OTP行為模式(behavior)以及為什么需要 OTP行為模式,我們向你展示了如何使用它們構(gòu)建獨(dú)立節(jié)點(diǎn)。這就是最初我們向 OReilly提供的草案,內(nèi)容僅限于此。但是在編寫本書時(shí),我們決定將內(nèi)容更進(jìn)一步,記錄下我們的實(shí)踐經(jīng)驗(yàn)、設(shè)計(jì)決策過程和架構(gòu)分布式系統(tǒng)時(shí)常見的一些問題。通過我們所做的這一系列設(shè)計(jì)選擇和折中,這些模式為我們提供了 Erlang/OTP眾所周知的可伸縮性、可靠性和可用性。與流行的觀點(diǎn)相反,這一切并非魔法般地開箱即得的,但獲得它們確實(shí)比其他任何非語義級別模擬 Erlang 的,或者不是運(yùn)行在 BEAM 虛擬機(jī)上的編程語言要容易得多。
Francesco:為什么寫這本書
有人曾告訴我,寫書有點(diǎn)像生孩子。一旦你寫完一本書,拿到紙質(zhì)圖書的那一刻,腦子里有的只是興奮和激動,而曾經(jīng)付出的艱辛將統(tǒng)統(tǒng)被忘掉,只渴望著趕快開始寫另一本。自從 2009 年 6 月首次拿到紙質(zhì)書以來,我一直有編寫 Erlang Programming(OReilly)續(xù)作的打算。在我開始這個(gè)項(xiàng)目時(shí),我還沒有自己的孩子,但最終這一項(xiàng)目花了如此長的時(shí)間以至于我的第二個(gè)孩子都已經(jīng)快出生了。美好的事物值得我們等待,誰說不是呢?
與第一本書一樣,本書是圍繞我在 Erlang Solutions公司所做的 OTP培訓(xùn)材料中的示例編寫的,我將使用這些例子時(shí)我的講解和教學(xué)過程轉(zhuǎn)化為文字。每當(dāng)完成一章后,我都會回顧并確保那些學(xué)生較難理解的部分我的講解是清晰的。最好的學(xué)生通常會問的那些問題最終被放到了補(bǔ)充材料部分,而篇幅較長的章則被分解成一些較短小的章。原本一切都很順利,直到我們到達(dá)第 11章和第 12 章,因?yàn)榘l(fā)行包制作和軟件升級沒有一種統(tǒng)一的方法,而是存在許多種工具。有些工具需要集成到客戶的構(gòu)建和發(fā)布過程中,而其他一些則是開箱即用的。還有一些已無法使用。對于任何想要理解系統(tǒng)的發(fā)行包制作和軟件升級包括其幕后工作原理的人,我們希望這兩章成為他們的終極指南。此外,如果你必須對現(xiàn)有工具進(jìn)行故障排除或編寫自己的工具,其中還介紹了你所需要了解的內(nèi)容。
但真正的麻煩從第 13 章才開始。由于沒有任何示例和培訓(xùn)材料,我發(fā)現(xiàn)自己必須將頭腦中的內(nèi)容形式化,將構(gòu)建 Erlang/OTP系統(tǒng)時(shí)所采取的方法落實(shí)為文檔,并嘗試將其與分布式計(jì)算理論結(jié)合起來。最終第 13 章變成了 4個(gè)章節(jié),并且花了寫出本書前 10章那么長的時(shí)間才完成。對于那些購買了早期訪問(early access)的讀者,我希望沒有辜負(fù)你們的等待。對于那些明智地等我們寫完才購買的朋友,希望你們喜歡這些內(nèi)容!
Steve:為什么寫這本書
我第一次發(fā)現(xiàn) Erlang/OTP是在 2006 年,當(dāng)時(shí)我正在研究如何能更快、更便宜、更好地開發(fā)企業(yè)集成軟件。無論我從哪個(gè)方面考察,Erlang/OTP都明顯優(yōu)于我和我的同事當(dāng)時(shí)一直使用的 C 和 Java 語言。2007 年,我加入了一家新公司,開始在商業(yè)產(chǎn)品中使用 Erlang/OTP,事實(shí)證明,我之前考察所發(fā)現(xiàn)的一切優(yōu)勢都是真的。我教一些同事使用了這種語言,不久后,我們開發(fā)的軟件比其他大多數(shù)人開發(fā)的都更強(qiáng)大、更可靠、更容易演進(jìn),并且能更快地投入生產(chǎn)環(huán)境,甚至與人員規(guī)模大得多的 C 團(tuán)隊(duì)相比優(yōu)勢依然明顯。直到今天,我仍然完全信賴 Erlang/OTP在實(shí)踐中表現(xiàn)出的令人印象深刻的高效性。
多年來我發(fā)表了不少技術(shù)資料,而我的目標(biāo)讀者一直都是像我這樣的其他從業(yè)者。這本書也不例外。在前面的 12 章中,我們提供了許多深入的實(shí)踐性細(xì)節(jié),使開發(fā)人員能夠充分理解 OTP的基本設(shè)計(jì)原則。在這些細(xì)節(jié)中包含了大量極具實(shí)用價(jià)值的知識各類模塊、函數(shù)和方案等它們將為你的日常設(shè)計(jì)、開發(fā)和調(diào)試工作節(jié)省大量時(shí)間和精力。在最后的 4章中,我們將轉(zhuǎn)變方向,聚焦于宏觀的層面,探討可伸縮分布式應(yīng)用在開發(fā)、部署和運(yùn)行時(shí)涉及的各種權(quán)衡取舍。由于與分布式系統(tǒng)、容錯(cuò)和 DevOps相關(guān)的知識、方案和需考慮的權(quán)衡數(shù)量著實(shí)龐大,所以要想將這些章節(jié)簡潔地寫出來難度可想而知,但我相信本書為此達(dá)到了適當(dāng)?shù)钠胶猓葹樽x者提供了大量好的建議,同時(shí)又能避免讀者迷失其中。
我希望這本書能幫助讀者提高所開發(fā)的軟件和系統(tǒng)的質(zhì)量及效用。
本書的讀者對象
本書的目標(biāo)受眾主要針對 Erlang 和 Elixir 開發(fā)人員和架構(gòu)師已經(jīng)完整閱讀過一本以上入門書籍,并準(zhǔn)備將知識提升到一個(gè)新的水平的人。這不是一本帶你入門的初等水平的書籍,而是一本涵蓋了許多其他書籍未涉及的高級內(nèi)容、讓你遠(yuǎn)超同行水平的書。其中第 3 章至第 12 章存在依賴關(guān)系,應(yīng)該順序閱讀,第 13 章至第 16章也是如此。如果你不需要回顧 Erlang 初級知識,可以跳過第 2 章。
如何閱讀本書
本書中的內(nèi)容兼容 Erlang 18.2。書中涉及的絕大部分功能同樣適用于先前版本的 Erlang;針對不適用的功能在書中均有指出。對于未來版本的不兼容性雖然在寫書時(shí)尚不可知,但將會在本書的勘誤頁面上進(jìn)行詳細(xì)說明,并修復(fù)本書 GitHub倉庫中的對應(yīng)代碼。我們鼓勵(lì)你從我們的 GitHub倉庫下載本書的示例代碼,并親自運(yùn)行以更好地理解相關(guān)知識。
致謝
撰寫本書是一個(gè)漫長的旅程。在進(jìn)行這項(xiàng)工作時(shí),我們得到了許多優(yōu)秀人士的幫助。編輯 Andy Oram給予了我們無數(shù)的想法和建議,耐心地指導(dǎo)我們,給予我們反饋,并且不斷鼓勵(lì)我們。 Andy,謝謝你,沒有你,我們無法完成此書! Simon Thompson Erlang Programming一書的合著者幫助了本書的構(gòu)思和起草,并為第 2章奠定了基礎(chǔ)。非常感謝 Robert Virding貢獻(xiàn)的一些例子。我們還得到了很多讀者、審稿人、貢獻(xiàn)者的幫助,為我們提供了許多反饋,有了這些,我們才能讓每一章的內(nèi)容充實(shí)。在此我們列出他們的姓名,并忐忑地希望沒有遺漏任何一位: 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。如果我們在名單中遺漏了您,我們真誠地向您道歉!給我們發(fā)一封電子郵件,我們會將您添加進(jìn)去。對 Erlang Solutions 職員中那些閱讀了本書早期撰寫過程中的手稿,以及其他早期為本書提供勘誤的人,我們必須大聲地向你們表示感謝。此外還要特別感謝所有通過社交媒體渠道鼓勵(lì)過我們的人,特別是其他作者。你知道我說的就是你們!最后但同樣重要的一點(diǎn)是,感謝 OReilly的制作、營銷和會議團(tuán)隊(duì),不斷提醒我們只要尚未付印工作就不算結(jié)束。我們非常感謝你們的支持!
第 1章 概述 1
定義問題 2
OTP 4
Erlang 6
工具和庫 7
系統(tǒng)設(shè)計(jì)原則 9
Erlang 節(jié)點(diǎn) 10
分布式、基礎(chǔ)設(shè)施、多核 11
總結(jié) 12
通過本書你將學(xué)到什么 13
第 2章 Erlang.簡介. 18
遞歸與模式匹配 18
受函數(shù)式的影響 22
玩轉(zhuǎn)匿名函數(shù) 22
列表推導(dǎo):生成與測試 23
進(jìn)程與消息傳遞 25
不怕出錯(cuò) 30
用于監(jiān)督的鏈接與監(jiān)視器 31
鏈接 31
監(jiān)視器 33
記錄 34
映射組 37
宏 38
模塊升級 39
ETS:Erlang 元素存儲 41
分布式 Erlang 44
命名與通信 45
節(jié)點(diǎn)間的連接與可見性 45
總結(jié) 47
接下來是什么 47
第 3章 行為模式. 49
進(jìn)程的骨架 49
設(shè)計(jì)模式 52
回調(diào)模塊 53
抽取出通用的行為模式 56
啟動 server 57
client函數(shù) 60
server循環(huán) 62
server內(nèi)部函數(shù) 64
通用服務(wù)器 65
消息傳遞:冰山之下 68
總結(jié) 71
接下來是什么 72
第 4章 通用型服務(wù)器.gen_server. 73
gen_server 73
behavior指令 74
啟動一個(gè) server 75
消息傳遞 77
同步式消息傳遞 78
異步式消息傳遞 79
其他消息 81
未處理的消息 82
同步客戶端 83
終止 84
調(diào)用超時(shí) 86
死鎖 89
通用型 server的超時(shí)問題 90
使 behavior休眠 92
全局化 92
鏈接 behavior 94
總結(jié) 94
接下來是什么 95
第 5章 深入控制 OTP行為模式 96
sys模塊 96
追蹤與記錄 96
系統(tǒng)消息 98
你自己的追蹤函數(shù) 98
統(tǒng)計(jì)信息和當(dāng)前狀態(tài) 99
sys 模塊總結(jié) 102
分裂時(shí)的可選項(xiàng) 103
內(nèi)存管理與垃圾回收 104
分裂時(shí)應(yīng)該避免使用的可選項(xiàng) 108
超時(shí) 109
總結(jié) 109
接下來是什么 109
第 6章 有限狀態(tài)機(jī). 110
Erlang 風(fēng)格的有限狀態(tài)機(jī) 111
Coffee FSM 112
硬件樁 114
Erlang 版咖啡機(jī) 114
gen_fsm 118
一個(gè)基于行為模式的例子 119
啟動 FSM 119
發(fā)送事件 123
終止 132
總結(jié) 133
親力親為 134
電話控制器 134
讓我們測試一下 136
接下來是什么 138
第 7章 事件處理器. 139
事件 139
通用事件管理器/處理器 141
啟動/停止事件管理器 141
添加事件處理器 142
刪除事件處理器 144
發(fā)送同步的或異步的事件 145
獲取數(shù)據(jù) 148
對錯(cuò)誤以及無效返回值的處理 150
交換事件處理器 152
融會貫通 154
SASL警報(bào)處理器 157
總結(jié) 159
接下來是什么 159
第 8章 監(jiān)督者 160
監(jiān)督樹 161
OTP監(jiān)督者 165
監(jiān)督者行為模式 166
啟動監(jiān)督者 166
監(jiān)督者規(guī)格 169
動態(tài)子進(jìn)程 176
非 OTP兼容進(jìn)程 184
可伸縮性和短期進(jìn)程 186
確定性同步啟動 187
測試你的監(jiān)督策略 188
與傳統(tǒng)方法相比又如何 190
總結(jié) 190
接下來是什么 191
第.9.章 OTP.application 192
OTP application是如何運(yùn)行的 193
OTP application的結(jié)構(gòu) 194
回調(diào)模塊 198
啟動和停止 application 198
application資源文件 202
基站控制器的 application文件 204
啟動 application 205
環(huán)境變量 208
application的類型與終止策略 210
分布式 application 211
分階段啟動 215
內(nèi)含型 application 217
內(nèi)含型 application 的分階段啟動 217
將監(jiān)督者與 application組合到一起 219
SASL應(yīng)用 220
進(jìn)度報(bào)告 224
錯(cuò)誤報(bào)告 225
崩潰報(bào)告 226
監(jiān)督者報(bào)告 227
總結(jié) 228
接下來是什么 229
第.10.章 基于特殊進(jìn)程打造自己的 behavior 230
特殊進(jìn)程 230
互斥體 231
啟動特殊進(jìn)程 232
互斥體的狀態(tài) 235
處理退出 236
系統(tǒng)消息 237
跟蹤與日志事件 238
合在一起 239
動態(tài)模塊和休眠 243
屬于你自己的 behavior 244
創(chuàng)建 behavior 時(shí)的要求 245
一個(gè)處理 TCP流的例子 245
總結(jié) 249
接下來是什么 250
第 11章 系統(tǒng)原則與發(fā)行包制作. 251
系統(tǒng)原則 252
發(fā)行包目錄結(jié)構(gòu) 253
發(fā)行包資源文件 257
創(chuàng)建發(fā)行包 260
創(chuàng)建 boot 文件 262
打包發(fā)行包 271
啟動腳本以及目標(biāo)上的配置 275
參數(shù)和標(biāo)志 277
init模塊 289
rebar3 290
生成一個(gè) rebar3 發(fā)行包項(xiàng)目 292
使用 rebar3 創(chuàng)建發(fā)行包 295
使用 rebar3 處理制作發(fā)行包時(shí)的項(xiàng)目依賴問題 298
總結(jié) 300
接下來是什么 304
第 12章 發(fā)行包升級 305
軟件升級 305
第一個(gè)版本的咖啡機(jī) FSM 308
添加一個(gè)新狀態(tài) 311
為發(fā)行包創(chuàng)建升級 314
負(fù)責(zé)升級的代碼 318
應(yīng)用程序升級文件 322
高級指令 325
發(fā)行包升級文件 328
低級指令 330
安裝升級 332
發(fā)行包處理器 334
升級環(huán)境變量 338
升級特殊進(jìn)程 338
在分布式環(huán)境下升級 339
升級模擬器和核心 application 340
使用 Rebar3進(jìn)行升級 341
總結(jié) 344
接下來是什么 346
第 13章 分布式架構(gòu) 347
節(jié)點(diǎn)類型與家族 348
聯(lián)網(wǎng) 351
分布式 Erlang 353
套接字與 SSL 359
面向服務(wù)和微服務(wù)的架構(gòu) 361
點(diǎn)對點(diǎn) 362
接口 364
總結(jié) 366
接下來是什么 367
第.14.章 永不停止的系統(tǒng) 368
可用性 368
容錯(cuò) 369
彈性 370
可靠性 371
數(shù)據(jù)共享 375
一致性和可用性之間的權(quán)衡 383
總結(jié) 384
接下來是什么 385
第.15.章 水平規(guī)模伸縮 386
水平規(guī)模伸縮與垂直規(guī)模伸縮 386
容量規(guī)劃 390
容量測試 392
平衡你的系統(tǒng) 394
找尋瓶頸 396
系統(tǒng)藍(lán)圖 398
負(fù)載調(diào)節(jié)與背壓 399
總結(jié) 401
接下來是什么 403
第 16章 監(jiān)視與搶救性支持 404
監(jiān)視 405
日志 406
指標(biāo) 411
警報(bào) 414
搶救性支持 416
總結(jié) 418
接下來是什么 420
索引 421