OTP包含了一組庫和實現(xiàn)方式,可以構(gòu)建大規(guī)模、容錯和分布式的應(yīng)用程序,包含了許多強大的工具,能夠?qū)崿F(xiàn)H248,SNMP等多種協(xié)議,核心概念是OTP行為,可以看作一個用回調(diào)函數(shù)作為參數(shù)的應(yīng)用程序框架,類似一個J2EE容器。行為負(fù)責(zé)解決問題的非函數(shù)部分,回調(diào)函數(shù)負(fù)責(zé)解決函數(shù)部分。
通過gen_server模塊可以實現(xiàn)事物語義和熱代碼交換,
1) 確定回調(diào)模塊名
2) 編寫接口函數(shù)
3) 在回調(diào)模塊里編寫6個必需的回調(diào)函數(shù)
當(dāng)服務(wù)器崩潰時,需要一種機制來檢測并重啟它,要用到監(jiān)測樹,即創(chuàng)建一個監(jiān)控器來管理服務(wù)器。監(jiān)測樹有兩種:一對一和一對多。
復(fù)制代碼 代碼如下:
$erl –boot start_sasl
會創(chuàng)建一個運行生產(chǎn)系統(tǒng)的環(huán)境,系統(tǒng)架構(gòu)支持庫(SASL,System Administration Support Libriaries)將負(fù)責(zé)錯誤記錄和過載保護等工作。
使用gen_server, gen_supervisor,application等行為,可以構(gòu)建可靠性為99.9999999的系統(tǒng)。
統(tǒng)一化的erlang消息:
1) 抽象了不同線路協(xié)議之間的區(qū)別
2) Erlang消息無需解析,接收進程不必先解析消息再處理,而http服務(wù)器就必須解析就收到的所有消息
3) Erlang消息可以包含任意復(fù)雜度的數(shù)據(jù)類型,而http消息必須被序列化成扁平化才能傳輸
4) Erlang消息可以在不同處理器之間傳送
常見的第三方庫有rebar(https://github.com/basho/rebar)和cowboy(https://githun.com/extend/cowboy)。 Rebar是管理erlang項目的事實標(biāo)準(zhǔn),用戶可以通過rebar創(chuàng)建新項目、編譯項目、打包它們,以及把它們與其他項目整合在一起,同時集成了github。Cowboy是一個用erlang編寫的高性能web服務(wù)器,是嵌入式web的熱門實現(xiàn)。另外,庫mochiweb2(http://github.com/mochi/mochiweb)的編碼和解碼方法可以實現(xiàn)json字符串和erlang數(shù)據(jù)類型的相互轉(zhuǎn)換。
Erlang程序在多核CPU上運行
1) 使用大量進程
2) 避免副作用,例如不使用共享式ETS或DETS
3) 避免順序瓶頸,可以選擇pmap代替map
4) 小消息,大計算
5) 用mapreduce使計算并行化
mapreaduce是一個并行高階函數(shù),定義如下
復(fù)制代碼 代碼如下:
-specmapreduce(F1,F2,Acc0,L) ->Acc
F1 = fun(Pid,X) ->void
F2 = fun(Key,[Value],Acc0) ->Acc
L = [X]
Acc = X =term()
Mapreduce 是在并行高階函數(shù)(phofs)模塊中定義的。