Erlang開發(fā)及應(yīng)用ppt課件_第1頁
Erlang開發(fā)及應(yīng)用ppt課件_第2頁
Erlang開發(fā)及應(yīng)用ppt課件_第3頁
Erlang開發(fā)及應(yīng)用ppt課件_第4頁
Erlang開發(fā)及應(yīng)用ppt課件_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Erlang開發(fā)及運(yùn)用litaochenggmailWhat is Erlang? ERicsson LANGuage? 函數(shù)式編程言語(FP) 面向并發(fā)(OC),基于音訊 Ericsson創(chuàng)建, 最初用于電信系統(tǒng)開發(fā) 成熟, 穩(wěn)定, 具有20多年歷史 適于電信系統(tǒng), 分布式系統(tǒng), 高并發(fā)效力器 Open Source, 跨平臺, GC 不適于底層系統(tǒng)開發(fā)History 1980s Ericsson實(shí)驗(yàn)室思索如何輕松開發(fā)電信系統(tǒng)運(yùn)用 1987年左右, Erlang浮出水面 1989年JAM虛擬機(jī)C言語實(shí)現(xiàn) 2019年OTP工程啟動, 交融開發(fā)閱歷, 提供易用, 強(qiáng)大的Erlang開發(fā)庫 201

2、9年開源 2019年出版 目前版本Erlang R13B1 (5.7.2)Erlang優(yōu)勢 多核SMP支持 內(nèi)建分布式支持 基于輕量進(jìn)程及音訊的高并發(fā)模型 代碼熱交換 開發(fā)速度快, 高性能, 高穩(wěn)定性 FP編程,代碼靈敏高效, 副作用小 豐富的分析及監(jiān)控程序 經(jīng)過商業(yè)產(chǎn)品, 長久大規(guī)模驗(yàn)證 OpenSource, 代碼面前無Erlang Hello World代碼hello.erl: 1 -module(hello).2 -compile(export_all).34 main() -5 io:format(hello world!n).編譯: $ erlc hello.erl運(yùn)轉(zhuǎn): $ er

3、lEshell V5.7.1 (abort with G)1 hello:main().hello world!ok Erlang Hello World CONT1 -module(hello).聲明模塊稱號,其必需和文件名一致.模塊是Erlang工程中代碼組織的根本方式.2 -compile(export_all).指明編譯選項(xiàng),export_all 用來導(dǎo)出一切本模塊中的函數(shù),exported function是模塊的接口,其他模塊只能調(diào)用exported function4 main() -為函數(shù)頭(head),包含函數(shù)稱號和參數(shù), 后緊隨一個(gè) -分割符5 io:format(hell

4、o world!n).為函數(shù)體(body),包含Erlang表達(dá)式,這里調(diào)用io模塊的format函數(shù)在默許輸出中打印hello world!在上面的運(yùn)轉(zhuǎn)結(jié)果中,最后有一個(gè)ok,這是io:format/1的前往值,表示打印勝利,Erlang中任何函數(shù)都有前往值.Erlang 語法 Data Types 8種根本類型 integer - 4, -4, 2#100, 16#4, 920828990801238101010. float - 3.0, 3.5e2, 6.5e-2, (IEEE754 64bit) atom - hello, your_name, roothost, IsAtom bi

5、nary - reference - make_ref(),一個(gè)隨機(jī)值 fun - fun() - some_expr end port - 與外部運(yùn)用進(jìn)展交互的接口 pid - process identifier, 用來操作process 2種復(fù)合類型 tuple - foo, male, 28, china, list - ip, any, port, 1234, binaryErlang 語法 CONT Pattern Match 言語層級的方式匹配, 代碼更加簡約. 適用于函數(shù)調(diào)用, case, receive, try表達(dá)式及 =操作 case Value of N when is

6、_integer(N) - N; _ when is_list(Value) - list_to_integer(Value) end 變量 大寫字母或 _ 開頭, 只能包含數(shù)字,字母,_, . 如 X, Name1, _Phone, _, Host 變量分為 Unbound和Bound, Unbound變量只能用在方式匹配中. 變量Bound后,Value就不可修正 變量只能單次賦值(并發(fā)及調(diào)試思索) N = 3 (ok) N = 4 ( oops! not match) Erlang 語法 CONT Binary匹配 運(yùn)用binary可以輕松的實(shí)現(xiàn)二進(jìn)制協(xié)議. (1)解析IP包: -def

7、ine(IP_VERSION, 4). -define(IP_MIN_HDR_LEN, 5).DgramSize = size(Dgram),case Dgram of when HLen = 5, 4*HLen =OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN), = RestDgram, Erlang 語法 CONT (2)自定義協(xié)議 假設(shè)我們定義了一個(gè)協(xié)議, 前2 bytes(16位) 標(biāo)志音訊體的長度, 后面為音訊體, 最后為占用1個(gè)byte的結(jié)尾符0 xef, 表示圖如下: - length - payload -ef |- 2 -|- Length -|-1

8、-| (單位byte) 那么對應(yīng)的binary匹配表達(dá)式如下: . Packet = . case Packet of - body, PayLoad; _ - error, invalid_packet end. Erlang 語法 CONT 序列化與反序列化 Erlang中序列化非常簡單 term_to_binary/1 - 將恣意數(shù)據(jù)轉(zhuǎn)化為二進(jìn)制序列 binary_to_term/1 - 將編碼的二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為Erlang數(shù)據(jù) 比如: Obj = apple, price, 2.0, origin, shandong, Bin = term_to_binary(Obj), Obj =

9、binary_to_term(Bin) CouchDB中大量運(yùn)用erlang的序列化相關(guān)函數(shù),完成數(shù)據(jù)的存儲與加載. Erlang 語法 CONT 函數(shù) 一切皆函數(shù), 每個(gè)調(diào)用都有return, 函數(shù)可以作為根本數(shù) 據(jù)類型. 作為前往值: op_fun(+) - fun(N1, N2) - N1 + N2 end; op_fun(-) - fun(N1, N2) - N1 - N2 end. 作為參數(shù): FIsEven = fun(E) - E band 2#1 =:= 0 end. lists:filter(FIsEven, 1, 2, 3, 4, 5, 6). 2, 4, 6 Erlang

10、 語法 CONT Tail Recursion尾遞歸 Erlang中沒有for, while關(guān)鍵字 可以利用遞歸實(shí)現(xiàn)循環(huán) 在server開發(fā)中,確保運(yùn)用尾遞歸: server_loop(Args) - .some action. server_loop(Args). 運(yùn)用尾遞歸,可以耗費(fèi)很少的內(nèi)存,僅僅是一個(gè)地址跳轉(zhuǎn). server_loop(Args) - .some action. server_loop(Args), other_fun(). Erlang 語法 CONT 發(fā)送Message ! 基于音訊通訊,No Lock! No Shared Memroy! Pid ! msg, h

11、ello, I love erlang 向Pid(本地或遠(yuǎn)程主機(jī))代表的進(jìn)程發(fā)送音訊 receive1, 阻塞等待恣意音訊:receive Msg - okend3,等待音訊,超時(shí)為5 sec:receive Msg - okafter 5000 - timeoutend 2,實(shí)現(xiàn)sleep:receiveafter Time - okend4,檢測能否存在音訊:receive SomeMsg - existafter 0 - no_existendErlang 并發(fā)關(guān)于Process每個(gè)Process擁有一個(gè)mailbox,保管音訊 Processes之間經(jīng)過發(fā)送異步Message進(jìn)展交互,

12、無共享形狀輕量,兼有OS Process的隔離及OS Thread的高效Process具有本人Stack, Heap, GCProcess可以位于Local,也可以位于Remote MachineProcess可以進(jìn)展多種方式的管理及控制(link, monitor, exit signal)Process為erlang高并發(fā),高容錯(cuò),分布式的根底并發(fā)Process數(shù): default 32768, max 268435456 Erlang 并發(fā) CONT 創(chuàng)建Process spawn(Fun), 比如 spawn(fun() - io:format(im pn, self() end).

13、im spawn(Mod, Fun, Args),比如 spawn(io, format, im pn, self(). im spawn_link, spawn_opt, spawn_monitor . 銷毀Process 進(jìn)程內(nèi)部調(diào)用 exit(Reason), 比如 exit(normal), 正常退出 進(jìn)程內(nèi)部發(fā)生異常導(dǎo)致程序退出 其他進(jìn)程調(diào)用 exit(PidBeTerminate, Reason) Erlang 并發(fā) CONT基于Process的http server 框架(one loop process, per conection per process): setup up

14、 listen socket,spawn(listen_process).in listen_process: while can accept new client connect accept , spawn(client_process) loopin client_process: process protocol, close socket. Erlang 并發(fā) CONT運(yùn)用Erlang我們可以:以明晰的風(fēng)格開發(fā)高并發(fā)的運(yùn)用 我們將不在受困于:線程池的復(fù)雜死鎖,競賽的窘迫內(nèi)存泄露部分問題,導(dǎo)致的全局解體 與跨平臺多核SMP的格格不入 Erlang 分布式 Erlang Node是分布

15、式通訊的根本單元,可以位于同一機(jī)器 or 多臺機(jī)器, 實(shí)現(xiàn)了原語級的節(jié)點(diǎn)通訊 Erlang Node 經(jīng)過 erl -sname Name or erlang -name Name啟動, 同一臺機(jī)器可以啟動多個(gè)Node 每臺機(jī)器上啟動Erlang Node時(shí),都會啟動一個(gè)epmd(Erlang Port Mapper Daemon, port 4396),用來進(jìn)展Node和Machine之間的映射 不同機(jī)器的Node之間經(jīng)過Tcp銜接進(jìn)展Message傳輸(可以自定義分布式通訊實(shí)現(xiàn),如經(jīng)過ssh) global維護(hù)一個(gè)全局的Nodes網(wǎng)絡(luò) spawn_link|_opt都具有分布式版本,可以再

16、其他節(jié)點(diǎn)創(chuàng)建ProcessErlang 分布式 CONT rpc 模塊可以在其他Node上執(zhí)行操作 slave, remsh, remote shell等方式啟動,銜接Erlang Node Erlang中進(jìn)程具有位置透明性 經(jīng)過message及receive表達(dá)式,輕松實(shí)現(xiàn)同步or異步, timeout等網(wǎng)絡(luò)通訊中多種機(jī)制 Erlang本身提供tcp,udp等常規(guī)的網(wǎng)絡(luò)編程方式 運(yùn)用Erlang內(nèi)建分布式機(jī)制,可以快速開發(fā)多種運(yùn)用,也可以基于socket開發(fā)各種專有運(yùn)用 Erlang 分布式 CONTErlang 分布式 CONT節(jié)點(diǎn)A2銜接節(jié)點(diǎn)B2步驟Node A2, B2啟動,綁定一個(gè)本

17、機(jī)端口,并注冊到本機(jī)的epmd(default port 4396)A2銜接HostB epmd,懇求獲取B2節(jié)點(diǎn)的綁定端口HostB epmd將B2的bind port及dist協(xié)議版本等信息前往給A2 A2與B2協(xié)商,建立tcp銜接,假設(shè)銜接勝利,維護(hù)一個(gè)tick,來定期檢測B2節(jié)點(diǎn) A2與B2節(jié)點(diǎn)之間的音訊,經(jīng)過此銜接進(jìn)展發(fā)送 Erlang OTP OTP(Open Telecom Platform),其定義了一系列工程開發(fā)中需求的方式及部署晉級戰(zhàn)略,為提高開發(fā)效率,構(gòu)建高效,穩(wěn)定系統(tǒng)提供了宏大的協(xié)助。 同最初時(shí)的專有電信平臺運(yùn)用已沒有太多關(guān)系 當(dāng)前系統(tǒng)都是采用OTP進(jìn)展開發(fā) Erlan

18、g中各種lib都是基于OTP開發(fā) 可以了解成某種輕量的框架,或者詳細(xì)化的設(shè)計(jì)方式 behaviours包含:application, supervisor, gen_server, gen_fsm, gen_event application,release,release handling 提供應(yīng)用的部署,晉級,回退等實(shí)現(xiàn)Erlang OTP CONTBehaviours經(jīng)過定義一些簡單的callback模塊實(shí)現(xiàn)特定功能.application 定義application,實(shí)現(xiàn)某種功能,由其他behaviours組成supervisor - 定義一個(gè)supervisor tree,實(shí)現(xiàn)各種戰(zhàn)

19、略的義務(wù)重啟機(jī)制gen_server - 定義一個(gè)通用的server模型,一個(gè)process loop,提供同步異步接口gen_fsm - 實(shí)現(xiàn)一個(gè)形狀機(jī)gen_event - 實(shí)現(xiàn)一個(gè)event manager及event handler模型與其它言語的交互 External App 外部運(yùn)用解體不會影響Erlang虛擬機(jī) Ports - 經(jīng)過port與外部運(yùn)用交互(stdin/stdout) Erl_Iterface - 提供c的封裝,方便開發(fā)port運(yùn)用 Link in Driver shared library (SO in Unix, DLL in Windows),影響Erlang

20、虛擬機(jī)穩(wěn)定性不引薦 Port dirvers -提供c封裝,運(yùn)轉(zhuǎn)在erlang虛擬機(jī)內(nèi)部 C Nodes 遵照erlang的交互協(xié)議, 運(yùn)用c實(shí)現(xiàn)的一個(gè)erlang node Jinterface 提供一系列與Erlang進(jìn)展交互的Java包Erlang 代碼片段 求某個(gè)數(shù)的階乘 factorial(0) - 1; factorial(N) - N factorial(N-1). 獲取遠(yuǎn)程機(jī)器的issue信息linux) -module(issue). -compile(export_all). % start server server() - register(issue_server,

21、spawn(fun server_loop/0). server_loop() - receive From, get, issue - From ! issue, get_issue(); _ - ok end, server_loop(). Erlang 代碼片段 CONtget_issue() - ok, Bin = file:read_file(/etc/issue), Bin.% start clientclient(ServerNode) - true = net_kernel:connect_node(ServerNode), issue_server, ServerNode !

22、 self(), get, issue, receive issue, Issue - io:format(server issue:sn, Issue) after 1000 - io:format(receive issue time outn) end. 調(diào)用:$ erl -sname server(serverlitao)1 issue:server().true$ erl -sname client(clientlitao)1 issue:client(serverlitao).server issue:Ubuntu 9.04 n l 產(chǎn)品開發(fā)流程 架構(gòu)設(shè)計(jì) 單臺 or 分布式? M

23、aster-Slave or Grid? Monitor, Failover, Net Comunication, Database, Replica . OTP Behaviourhow many application?use supervisor, gen_server, gen_fsm, gen_event Coding, 及單元測試用例. 每個(gè)module都經(jīng)過測試(eunit) 編寫系統(tǒng)測試框架,覆蓋測試,確保系統(tǒng)正確(common test) 壓力測試,分析性能瓶頸,進(jìn)展優(yōu)化(fprof) 系統(tǒng)上線,監(jiān)控功能(ganglia, nagios, monit) 新的功能或需求,反復(fù)2

24、-7一些工具appmon - OTP application監(jiān)控工具cover - erlang代碼覆蓋測試ntop - 顯示Node中進(jìn)程信息(unix top)make - erlang中的make工具pman - erlang中進(jìn)程管理器tv - ets 和 mnesia 查看器fprof - erlang系統(tǒng)性能分析common_test - erlang測試框架dialyzer - 代碼靜態(tài)分析debugger - 單步伐試工具,基于(tcl/tk 學(xué)習(xí)資源Erlang官方網(wǎng)站/doc Erlang China /Erlang Ma

25、ilistnabble/Erlang-Questions-f14096.htmlErlang P/Erlang非業(yè)余研討mryufeng.javaeye/Erlang Display erlangdisplay.javaeye/ 開源工程ejabberd - the Erlang Jabber/XMPP daemon RabbitMQ - AMQP serverCouchDB - schema-free document databaseTsung - multi-protocol distributed load testing Scalaris -

26、 distributed key-value storeDisco - MapReduce Framework Mochiweb - Powerful Server Tookit本人動手發(fā)起erlang開源工程!案例 AXD301 高并發(fā)的電信交換機(jī) 99.9999999% 可靠性(3ms 缺點(diǎn)/年) 超越100萬行Erlang代碼 軟實(shí)時(shí)系統(tǒng) 高容錯(cuò)案例 WEB IM后臺(mochiweb) 7+ 百萬活潑用戶 100 server ajax + comet(long-polling)更多運(yùn)用x=t(q$mZiVfRbO7K4G0D.zw-s*o!lXhUdQaM6J3F:Czv-s&

27、;o!kXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6I2F;Bzv-r&o#kXgTdP9M6I2F;Byv)r&o#kXgTdP9M5I2E;Bx=t(q%mZjVfSbO8K4H0D.zw+s*p!lYhUeQaN6J3F:Cyv)r&n#kWgTcP9L5I2E;Bx=t(q$mZiVfRbO7K4H0D.zw-s*o!lXhUdQaN6J3F:Czv-s&o!lXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6I2F:Bzv-r&o#kXhTdQ9M6I2F;Byv-r&o#kXgTdP9M5I2E;

28、Byv)r&n#kWgTcP9M5I2E;Bx=t(q$mZiVfSbO8K4H0D.zw-s*o!lXhUeQaN6J3F:Czw-s*o!lXhUdQaM6J2F:Byu)ZiVfSbO8K4H0D.zw-s*o!lYhUeQaN6J3F:Czw-s*o!lXhUdQaM6J2F:Czv-s&o!kXhTdQaM6J2F:Bzv-r&o!kXhTdQ9M6I2F;Bzv-r&o#kXgTdP9M5I2F;Byv)r&n#kWgTdP9M5I2E;Bx=t(q$mZjVfSbO8K4H0D.zw-s*p!lYhUeQaN6J3F:Cyv)r&n

29、#kWgTcP9L5I1E;Bx=t(q$mZiVfRbO7K4G0D.zw-s*o!lXhUdQaM6J3F:Czv-s&o!kXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6I2F;Bzv-s&o!lXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6I2F:Bzv-r&o#kXgTdQ9M6I2F;Byv)r&o#kXgTdP9M5I2E;Bx=u(q%mZjVfSbO8K4H0D.Aw+s*p!lYhUeQaN6J3F:Cyv)r&n#kWgTcP9L5I2E;Bx=t(q$mZiVfRbO8K4H0D.zw-s*

30、o!lXhUeQaN6J3F:Czv-s*o!lXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6J2F:Bzv-r&o#kXhTdQ9M6I2F;B)q%nZjWfScP8L5H1E.Aw+t*p$lYiVeRbN7K3G0Czv-r&o#kXhTdQ9M6I2F;Bzv-r&o#kXgTdP9M5I2E;Byv)r&n#kWgTdP9M5I2E;Bx=t(q$mZiVfSbO8K4H0D.zw-s*o!lYhUeQaN6J3F:Czw-s*o!lXhUdQaM6J2F:Czv-s&o!kXhTdQaM6J2F:Bzv-s&o!

31、kXhTdQ9M6I2F;Bzv-r&o#kXgTdP9M6I2F;Byv)r&n#kXgTdP9M5I.Aw+t*p$lYiUeRaN7J3G0Czv-r&o#kXgTdP9M6I2F;Byv)r&n#kXgTdP9M5I2E;Bx=t(q%mZjVfSbO8K4H0D.zw+s*p!lYhUeQaN6J3F:Cyv)r&n#kWgTcP9L5I1E;Bx=t(q$mZiVfRbO7K4H0D.zw-s*o!lXhUdQaN6J3F:Czv-s&o!lXhUdQaM6J2F:Bzv-s&o!kXhTdQ9M6I2F:Bzv-r&o#kXgTdQ9M6I2F;Byv-r&o#kXgTdP9M5IAw+t*p$lYiUeRbN7K3G0Czv

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論