天天看點

Erlang中的OTP簡要

版權聲明:本文為半吊子子全棧工匠(wireless_com,同公衆号)原創文章,未經允許不得轉載。 https://blog.csdn.net/wireless_com/article/details/44114741

OTP包含了一組庫和實作方式,可以建構大規模、容錯和分布式的應用程式,包含了許多強大的工具,能夠實作H248,SNMP等多種協定,核心概念是OTP行為,可以看作一個用回調函數作為參數的應用程式架構,類似一個J2EE容器。行為負責解決問題的非函數部分,回調函數負責解決函數部分。

通過gen_server子產品可以實作事物語義和熱代碼交換,

1)      确定回調子產品名

2)      編寫接口函數

3)      在回調子產品裡編寫6個必需的回調函數

當伺服器崩潰時,需要一種機制來檢測并重新開機它,要用到監測樹,即建立一個監控器來管理伺服器。監測樹有兩種:一對一和一對多。

$erl –boot start_sasl

會建立一個運作生産系統的環境,系統架構支援庫(SASL,System Administration Support Libriaries)将負責錯誤記錄和過載保護等工作。

使用gen_server, gen_supervisor,application等行為,可以建構可靠性為99.9999999的系統。

統一化的erlang消息:

1)  抽象了不同線路協定之間的差別

2)  Erlang消息無需解析,接收程序不必先解析消息再處理,而http伺服器就必須解析就收到的所有消息

3)  Erlang消息可以包含任意複雜度的資料類型,而http消息必須被序列化成扁平化才能傳輸

4)  Erlang消息可以在不同處理器之間傳送

常見的第三方庫有rebar(https://github.com/basho/rebar)和cowboy(https://githun.com/extend/cowboy)。 Rebar是管理erlang項目的事實标準,使用者可以通過rebar建立新項目、編譯項目、打包它們,以及把它們與其他項目整合在一起,同時內建了github。Cowboy是一個用erlang編寫的高性能web伺服器,是嵌入式web的熱門實作。另外,庫mochiweb2(http://github.com/mochi/mochiweb)的編碼和解碼方法可以實作json字元串和erlang資料類型的互相轉換。

Erlang程式在多核CPU上運作

1)  使用大量程序

2)  避免副作用,例如不使用共享式ETS或DETS

3)  避免順序瓶頸,可以選擇pmap代替map

4)  小消息,大計算

5)  用mapreduce使計算并行化

mapreaduce是一個并行高階函數,定義如下

-specmapreduce(F1,F2,Acc0,L) ->Acc

         F1 = fun(Pid,X) ->void

         F2 = fun(Key,[Value],Acc0) ->Acc

         L = [X]

         Acc = X =term()

Mapreduce 是在并行高階函數(phofs)子產品中定義的。