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

下載本文檔

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

文檔簡(jiǎn)介

Erlang開(kāi)發(fā)及應(yīng)用litaocheng@WhatisErlang?

ERicsson

LANGuage?函數(shù)式編程語(yǔ)言(FP)面向并發(fā)(OC),基于消息Ericsson創(chuàng)建,最初用于電信系統(tǒng)開(kāi)發(fā)成熟,穩(wěn)定,具有20多年歷史適于電信系統(tǒng),分布式系統(tǒng),高并發(fā)服務(wù)器OpenSource,跨平臺(tái),GC

不適于底層系統(tǒng)開(kāi)發(fā)History1980sEricsson實(shí)驗(yàn)室思考如何輕松開(kāi)發(fā)電信系統(tǒng)應(yīng)用1987年左右,Erlang浮出水面1989年JAM虛擬機(jī)C語(yǔ)言實(shí)現(xiàn)

1996年OTP項(xiàng)目啟動(dòng),融合開(kāi)發(fā)經(jīng)驗(yàn),提供易用,強(qiáng)大的Erlang開(kāi)發(fā)庫(kù)1998年開(kāi)源2007年《ProgrammingErlang》出版目前版本ErlangR13B1(5.7.2)ErlangHelloWorld代碼hello.erl:1-module(hello).2-compile([export_all]).3

4main()->5

io:format("helloworld!~n").編譯:

$erlchello.erl運(yùn)行:

$erlEshellV5.7.1

(abortwith^G)

1>hello:main().

helloworld!

ok

ErlangHelloWorldCON'T1-module(hello).聲明模塊名稱,其必須和文件名一致.模塊是Erlang項(xiàng)目中代碼組織的基本方式.2-compile([export_all]).指明編譯選項(xiàng),export_all用來(lái)導(dǎo)出所有本模塊中的函數(shù),exportedfunction是模塊的接口,其他模塊只能調(diào)用exportedfunction4main()->為函數(shù)頭(head),包含函數(shù)名稱和參數(shù),后緊隨一個(gè)'->'分割符5

io:format("helloworld!~n").為函數(shù)體(body),包含Erlang表達(dá)式,這里調(diào)用io模塊的format函數(shù)在默認(rèn)輸出中打印"helloworld!"

在上面的運(yùn)行結(jié)果中,最后有一個(gè)"ok",這是io:format/1的返回值,表示打印成功,Erlang中任何函數(shù)都有返回值.Erlang語(yǔ)法DataTypes

8種基本類型integer-4,

-4,2#100,16#4,9238101010..float-3.0,3.5e2,6.5e-2,(IEEE75464bit)atom-hello,your_name,root@host,'IsAtom'binary-<<"sometext">>reference-make_ref(),一個(gè)隨機(jī)值fun-fun()->some_exprendport-與外部應(yīng)用進(jìn)行交互的接口pid-processidentifier,用來(lái)操作process

2種復(fù)合類型tuple-{foo,male,28,china,<<"iloveerlang">>}

list-[{ip,any},{port,1234},binary]Erlang語(yǔ)法CON'TBinary匹配使用binary可以輕松的實(shí)現(xiàn)二進(jìn)制協(xié)議.(1)解析IP包:-define(IP_VERSION,4).-define(IP_MIN_HDR_LEN,5)....

DgramSize=size(Dgram),

caseDgramof

<<?IP_VERSION:4,HLen:4,SrvcType:8,TotLen:16,

ID:16,Flgs:3,FragOff:13,

TTL:8,Proto:8,HdrChkSum:16,

SrcIP:32,

DestIP:32,RestDgram/binary>>whenHLen>=5,4*HLen=<DgramSize->

OptsLen=4*(HLen-?IP_MIN_HDR_LEN),

<<Opts:OptsLen/binary,Data/binary>>=RestDgram,

Erlang語(yǔ)法CON'T

(2)自定義協(xié)議假如我們定義了一個(gè)協(xié)議,前2bytes(16位)標(biāo)記消息體的長(zhǎng)度,后面為消息體,最后為占用1個(gè)byte的結(jié)尾符0xef,示意圖如下:[---length---][---------payload------][ef]|------2-------|----------Length-------|-1-|(單位byte)則對(duì)應(yīng)的binary匹配表達(dá)式如下:...Packet=...casePacketof

<<Len:16,

PayLoad:Len/binary,16#ef>>->

{body,PayLoad};

_->

{error,invalid_packet}end.

Erlang語(yǔ)法CON'T序列化與反序列化Erlang中序列化非常簡(jiǎn)單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=binary_to_term(Bin)CouchDB中大量使用erlang的序列化相關(guān)函數(shù),完成數(shù)據(jù)的存儲(chǔ)與加載.

Erlang語(yǔ)法CON'TTailRecursion尾遞歸Erlang中沒(méi)有for,while關(guān)鍵字可以利用遞歸實(shí)現(xiàn)循環(huán)在server開(kāi)發(fā)中,確保使用尾遞歸:server_loop(Args)->

...someaction...

server_loop(Args).使用尾遞歸,可以消耗很少的內(nèi)存,僅僅是一個(gè)地址跳轉(zhuǎn).server_loop(Args)->

...someaction...

server_loop(Args),

other_fun().Erlang語(yǔ)法CON'T

發(fā)送Message"!"

基于消息通信,NoLock!NoSharedMemroy!

Pid!{msg,"hello,Iloveerlang"}

向Pid(本地或遠(yuǎn)程主機(jī))代表的進(jìn)程發(fā)送消息receive1,阻塞等待任意消息:receive

Msg->okend3,等待消息,超時(shí)為5sec:receive

Msg->okafter5000->

timeoutend2,實(shí)現(xiàn)sleep:receiveafterTime->

okend4,檢測(cè)是否存在消息:receive

SomeMsg->existafter0->

no_existendErlang并發(fā)關(guān)于Process每個(gè)Process擁有一個(gè)mailbox,保存消息Processes之間通過(guò)發(fā)送異步Message進(jìn)行交互,無(wú)共享狀態(tài)輕量,兼有OSProcess的隔離及OSThread的高效Process具有自己Stack,Heap,GCProcess可以位于Local,也可以位于RemoteMachineProcess能夠進(jìn)行多種形式的管理及控制(link,monitor,exitsignal)Process為erlang高并發(fā),高容錯(cuò),分布式的基礎(chǔ)并發(fā)Process數(shù):default32768,max268435456Erlang并發(fā)CON'T基于Process的httpserver框架(oneloopprocess,perconectionperprocess):

setupuplistensocket,spawn(listen_process).inlisten_process:

whilecanacceptnew

clientconnect

accept

,

spawn(client_process)

loopinclient_process:

processprotocol,

closesocket.

Erlang并發(fā)CON'T使用Erlang我們可以:以清晰的風(fēng)格開(kāi)發(fā)高并發(fā)的應(yīng)用

我們將不在受困于:線程池的復(fù)雜死鎖,競(jìng)賽的窘迫內(nèi)存泄露局部問(wèn)題,導(dǎo)致的全局崩潰與跨平臺(tái)多核SMP的格格不入

Erlang分布式ErlangNode是分布式通訊的基本單元,可以位于同一機(jī)器or多臺(tái)機(jī)器,實(shí)現(xiàn)了原語(yǔ)級(jí)的節(jié)點(diǎn)通訊ErlangNode通過(guò)erl-snameName

orerlang-nameName啟動(dòng),同一臺(tái)機(jī)器可以啟動(dòng)多個(gè)Node每臺(tái)機(jī)器上啟動(dòng)ErlangNode時(shí),都會(huì)啟動(dòng)一個(gè)epmd(ErlangPortMapperDaemon,port4396),用來(lái)進(jìn)行Node和Machine之間的映射不同機(jī)器的Node之間通過(guò)Tcp連接進(jìn)行Message傳輸(可以自定義分布式通訊實(shí)現(xiàn),如通過(guò)ssh)global維護(hù)一個(gè)全局的Nodes網(wǎng)絡(luò)spawn[_link|_opt]都具有分布式版本,可以再其他節(jié)點(diǎn)創(chuàng)建ProcessErlang分布式CON'TErlang分布式CON'T節(jié)點(diǎn)A2連接節(jié)點(diǎn)B2步驟NodeA2,B2啟動(dòng),綁定一個(gè)本機(jī)端口,并注冊(cè)到本機(jī)的epmd(defaultport4396)A2連接HostBepmd,請(qǐng)求獲取B2節(jié)點(diǎn)的綁定端口HostBepmd將B2的bindport及dist協(xié)議版本等信息返回給A2

A2與B2協(xié)商,建立tcp連接,如果連接成功,維護(hù)一個(gè)tick,來(lái)定期檢測(cè)B2節(jié)點(diǎn)

A2與B2節(jié)點(diǎn)之間的消息,通過(guò)此連接進(jìn)行發(fā)送

ErlangOTPOTP(OpenTelecomPlatform),其定義了一系列項(xiàng)目開(kāi)發(fā)中需要的模式及部署升級(jí)策略,為提高開(kāi)發(fā)效率,構(gòu)建高效,穩(wěn)定系統(tǒng)提供了巨大的幫助。同最初時(shí)的專有電信平臺(tái)應(yīng)用已沒(méi)有太多關(guān)系當(dāng)前系統(tǒng)都是采用OTP進(jìn)行開(kāi)發(fā)Erlang中各種lib都是基于OTP開(kāi)發(fā)可以理解成某種輕量的框架,或者具體化的設(shè)計(jì)模式behaviours包含:application,supervisor,gen_server,gen_fsm,gen_eventapplication,release,releasehandling提供應(yīng)用的部署,升級(jí),回退等實(shí)現(xiàn)與其它語(yǔ)言的交互ExternalApp外部應(yīng)用崩潰不會(huì)影響Erlang虛擬機(jī)Ports-通過(guò)port與外部應(yīng)用交互(stdin/stdout)Erl_Iterface-提供c的封裝,方便開(kāi)發(fā)port應(yīng)用LinkinDriversharedlibrary(SOinUnix,DLLinWindows),影響Erlang虛擬機(jī)穩(wěn)定性(不推薦)Portdirvers-提供c封裝,運(yùn)行在erlang虛擬機(jī)內(nèi)部CNodes遵照erlang的交互協(xié)議,使用c實(shí)現(xiàn)的一個(gè)erlangnodeJinterface提供一系列與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]).

%%startserver

server()->

register(issue_server,spawn(funserver_loop/0)).

server_loop()->

receive

{From,{get,issue}}->

From!{issue,get_issue()};

_->

ok

end,

server_loop().

一些工具appmon-OTPapplication監(jiān)控工具cover-

erlang代碼覆蓋測(cè)試ntop-顯示Node中進(jìn)程信息(unixtop)make-erlang中的make工具pman-erlang中進(jìn)程管理器tv-ets和mnesia查看器fprof-

erlang系統(tǒng)性能分析common_test-erlang測(cè)試框架dialyzer-代碼靜態(tài)分析debugger-單步調(diào)試工具,基于(tcl/tk)學(xué)習(xí)資源Erlang官方網(wǎng)站

ErlangChinaErlangMailistErlangPlanetErlang非業(yè)余研究ErlangDisplay

開(kāi)源項(xiàng)目ejabberd-theErlangJabber/XMPPdaemon

RabbitMQ-AMQPserverCouchDB-schema-freedocumentdatabaseTsung-multi-protocoldistributedloadtesting

Scalaris-distributedkey-valuestoreDisco-MapReduceFramework

Mochiweb-PowerfulHttpServerTookit自己動(dòng)手發(fā)起erlang開(kāi)源項(xiàng)目!案例AXD301高并發(fā)的電信交換機(jī)99.9999999%可靠性(~3ms故障/年)超過(guò)100萬(wàn)行Erlang代碼軟實(shí)時(shí)系統(tǒng)高容錯(cuò)案例WEBIM后臺(tái)(mochiweb)

7+百萬(wàn)活躍用戶~100serverajax+comet(long-polling)更多應(yīng)用x=t(q$mZiVfRbO7K4G0D.z`w-s*o!lXhUdQaM6J3F:C<y@u)r%n#jWgScP9L5I1E;A~x+t(p$mYiVeRbO7K4G0D>z`v-s&o!kXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfScO8L4H1E.A~w+t*p$lYiUeRaN7K3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&o#kXgTdP9M5I2E;B~x=t(q%mZjVfSbO8K4H0D.z`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I2E;B~x=t(q$mZiVfRbO7K4H0D.z`w-s*o!lXhUdQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mZiVfRbO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0D>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3G:C>y@v)r&n#kWgTcP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:B<y@u)ZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5H1E;A~x+t(p$mYiVeRbN7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$lYiVeRbN7K3G0C>z@v-r&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G:C>z@v-r&o#kXgTdP9M5I2F;B<x=u(q%mZjVfSbO8L4H1D.A`w+s*p!lYhUeRaN7J3G:C>y@v)r&n#kWgTdP9M5I2E;B~x=t(q$mZjVfSbO8K4H0D.z`w-s*p!lYhUeQaN6J3F:C<y@v)r&n#kWgTcP9L5I1E;B~x=t(q$mZiVfRbO7K4G0D.z`w-s*o!lXhUdQaM6J3F:C<y@u)r%n#jWgScP9L5I1E;A~x+t(p$mYiVfRbO7K4G0D>z`v-s&o!kXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)q%n#jWgScP8L5H1E.A~w+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L4H1E.A~w+t*p$lYiUeRaN7K3G0C>z@v-r&o#kXgTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&o#kXgTdP9M5I2E;B~x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I2E;B~x=t(q$mZiVfRbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mZiVfRbO7K4G0D>z`v-s*o!lXhUdQaM6J2F:B<y@u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0D>z`v-s&o!kXhTdQ9M6J2F:B<y=u)q%nZjWfScP8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%nZjWfScO8L4H1D.A`w+t*p$lYiUeRaN7J3G:C>)q%nZjWfScP8L5H1E.A~w+t*p$lYiVeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%nZjWfScO8L4H1D.A`w+t*p$lYiUeRaN7J3G:C>z@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H1D.A`w+s*p!lYhUeQaN7J3G:C>y@v)r&n#kWgTdP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r&n#kWgTcP9L5I1E;A~x=t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5I1E;A~x+t(p$mYiVeRbO7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<y=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYhUeRaN7J3G:C>y@v)r&n#kXgTdP9M5I.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%mZjVfScO8L4H1D.A`w+s*p!lYiUeRaN7J3G:C>y@v)r&n#kXgTdP9M5I2E;B~x=t(q%mZjVfSbO8K4H0D.z`w+s*p!lYhUeQaN6J3F:C>y@v)r&n#kWgTcP9L5I1E;B~x=t(q$mZiVfRbO7K4H0D.z`w-s*o!lXhUdQaN6J3F:C<y@u)r%n#jWgTcP9L5I1E;A~x+t(p$mYiVfRbO7K4G0D>z`v-s&o!lXhUdQaM6J2F:B<y=u)r%n#jWgScP8L5H1E.A~x+t(p$mYiVeRbN7K3G0C>z`v-s&o!kXhTdQ9M6I2F:B<y=u)q%nZjWfScO8L5H1E.A~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXgTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5IA~w+t*p$lYiUeRbN7K3G0C>z@v-r&o#kXhTdQ9M6I2F;B<x=u(q%mZjWfScO8L4H1D.A`w+s*p$lYiUeRaN7J3G:C>y@v-r&o#kXgTdP9M5I2E;B<x=u(q%mZjVfSbO8K4H0D.A`w+s*p!lYhUeQaN6J3G:C>y@v)r&n#kWgTcP9M5I2E;B~x=t(q$mZiVfSbO8K4H0D.z`w-s*o!lXhUeQaN6J3F:C<y@u)r%n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:B<y(q$mZiVfSbO8K4H0D.z`w-s*o!lYhUeQaN6J3F:C<y@u)r&n#kWgTcP9L5I1E;A~x+t(q$mZiVfRbO7K4G0D>z`w-s*o!lXhUdQaM6J2F:C<y@u)r%n#jWgScP8L5I1E;A~x+t(p$mYiVeRbN7K4G0D>z`v-s&o!kXhTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-r&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$hTdQaM6J2F:B<y=u)q%nZjWgScP8L5H1E.A~w+t*p$mYiVeRbN7K3G0C>z@v-s&o!kXhTdQ9M6I2F;B<x=u)q%nZjWfScO8L4H1D.A~w+t*p$lYiUeRaN7J3G0C>z@v-r&o#kXgTdP9M6I2F;B<x=u(q%

溫馨提示

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

評(píng)論

0/150

提交評(píng)論