




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Erlang開發及應用litaocheng@WhatisErlang?
ERicsson
LANGuage?函數式編程語言(FP)面向并發(OC),基于消息Ericsson創建,最初用于電信系統開發成熟,穩定,具有20多年歷史適于電信系統,分布式系統,高并發服務器OpenSource,跨平臺,GC
不適于底層系統開發History1980sEricsson實驗室思考如何輕松開發電信系統應用1987年左右,Erlang浮出水面1989年JAM虛擬機C語言實現
1996年OTP項目啟動,融合開發經驗,提供易用,強大的Erlang開發庫1998年開源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運行:
$erlEshellV5.7.1
(abortwith^G)
1>hello:main().
helloworld!
ok
ErlangHelloWorldCON'T1-module(hello).聲明模塊名稱,其必須和文件名一致.模塊是Erlang項目中代碼組織的基本方式.2-compile([export_all]).指明編譯選項,export_all用來導出所有本模塊中的函數,exportedfunction是模塊的接口,其他模塊只能調用exportedfunction4main()->為函數頭(head),包含函數名稱和參數,后緊隨一個'->'分割符5
io:format("helloworld!~n").為函數體(body),包含Erlang表達式,這里調用io模塊的format函數在默認輸出中打印"helloworld!"
在上面的運行結果中,最后有一個"ok",這是io:format/1的返回值,表示打印成功,Erlang中任何函數都有返回值.Erlang語法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(),一個隨機值fun-fun()->some_exprendport-與外部應用進行交互的接口pid-processidentifier,用來操作process
2種復合類型tuple-{foo,male,28,china,<<"iloveerlang">>}
list-[{ip,any},{port,1234},binary]Erlang語法CON'TBinary匹配使用binary可以輕松的實現二進制協議.(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語法CON'T
(2)自定義協議假如我們定義了一個協議,前2bytes(16位)標記消息體的長度,后面為消息體,最后為占用1個byte的結尾符0xef,示意圖如下:[---length---][---------payload------][ef]|------2-------|----------Length-------|-1-|(單位byte)則對應的binary匹配表達式如下:...Packet=...casePacketof
<<Len:16,
PayLoad:Len/binary,16#ef>>->
{body,PayLoad};
_->
{error,invalid_packet}end.
Erlang語法CON'T序列化與反序列化Erlang中序列化非常簡單term_to_binary/1-將任意數據轉化為二進制序列binary_to_term/1-將編碼的二進制數據轉化為Erlang數據比如:Obj={apple,{price,2.0},{origin,shandong}},Bin=term_to_binary(Obj),Obj=binary_to_term(Bin)CouchDB中大量使用erlang的序列化相關函數,完成數據的存儲與加載.
Erlang語法CON'TTailRecursion尾遞歸Erlang中沒有for,while關鍵字可以利用遞歸實現循環在server開發中,確保使用尾遞歸:server_loop(Args)->
...someaction...
server_loop(Args).使用尾遞歸,可以消耗很少的內存,僅僅是一個地址跳轉.server_loop(Args)->
...someaction...
server_loop(Args),
other_fun().Erlang語法CON'T
發送Message"!"
基于消息通信,NoLock!NoSharedMemroy!
Pid!{msg,"hello,Iloveerlang"}
向Pid(本地或遠程主機)代表的進程發送消息receive1,阻塞等待任意消息:receive
Msg->okend3,等待消息,超時為5sec:receive
Msg->okafter5000->
timeoutend2,實現sleep:receiveafterTime->
okend4,檢測是否存在消息:receive
SomeMsg->existafter0->
no_existendErlang并發關于Process每個Process擁有一個mailbox,保存消息Processes之間通過發送異步Message進行交互,無共享狀態輕量,兼有OSProcess的隔離及OSThread的高效Process具有自己Stack,Heap,GCProcess可以位于Local,也可以位于RemoteMachineProcess能夠進行多種形式的管理及控制(link,monitor,exitsignal)Process為erlang高并發,高容錯,分布式的基礎并發Process數:default32768,max268435456Erlang并發CON'T基于Process的httpserver框架(oneloopprocess,perconectionperprocess):
setupuplistensocket,spawn(listen_process).inlisten_process:
whilecanacceptnew
clientconnect
accept
,
spawn(client_process)
loopinclient_process:
processprotocol,
closesocket.
Erlang并發CON'T使用Erlang我們可以:以清晰的風格開發高并發的應用
我們將不在受困于:線程池的復雜死鎖,競賽的窘迫內存泄露局部問題,導致的全局崩潰與跨平臺多核SMP的格格不入
Erlang分布式ErlangNode是分布式通訊的基本單元,可以位于同一機器or多臺機器,實現了原語級的節點通訊ErlangNode通過erl-snameName
orerlang-nameName啟動,同一臺機器可以啟動多個Node每臺機器上啟動ErlangNode時,都會啟動一個epmd(ErlangPortMapperDaemon,port4396),用來進行Node和Machine之間的映射不同機器的Node之間通過Tcp連接進行Message傳輸(可以自定義分布式通訊實現,如通過ssh)global維護一個全局的Nodes網絡spawn[_link|_opt]都具有分布式版本,可以再其他節點創建ProcessErlang分布式CON'TErlang分布式CON'T節點A2連接節點B2步驟NodeA2,B2啟動,綁定一個本機端口,并注冊到本機的epmd(defaultport4396)A2連接HostBepmd,請求獲取B2節點的綁定端口HostBepmd將B2的bindport及dist協議版本等信息返回給A2
A2與B2協商,建立tcp連接,如果連接成功,維護一個tick,來定期檢測B2節點
A2與B2節點之間的消息,通過此連接進行發送
ErlangOTPOTP(OpenTelecomPlatform),其定義了一系列項目開發中需要的模式及部署升級策略,為提高開發效率,構建高效,穩定系統提供了巨大的幫助。同最初時的專有電信平臺應用已沒有太多關系當前系統都是采用OTP進行開發Erlang中各種lib都是基于OTP開發可以理解成某種輕量的框架,或者具體化的設計模式behaviours包含:application,supervisor,gen_server,gen_fsm,gen_eventapplication,release,releasehandling提供應用的部署,升級,回退等實現與其它語言的交互ExternalApp外部應用崩潰不會影響Erlang虛擬機Ports-通過port與外部應用交互(stdin/stdout)Erl_Iterface-提供c的封裝,方便開發port應用LinkinDriversharedlibrary(SOinUnix,DLLinWindows),影響Erlang虛擬機穩定性(不推薦)Portdirvers-提供c封裝,運行在erlang虛擬機內部CNodes遵照erlang的交互協議,使用c實現的一個erlangnodeJinterface提供一系列與Erlang進行交互的Java包Erlang代碼片段求某個數的階乘
factorial(0)->1;
factorial(N)->N*factorial(N-1).獲取遠程機器的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監控工具cover-
erlang代碼覆蓋測試ntop-顯示Node中進程信息(unixtop)make-erlang中的make工具pman-erlang中進程管理器tv-ets和mnesia查看器fprof-
erlang系統性能分析common_test-erlang測試框架dialyzer-代碼靜態分析debugger-單步調試工具,基于(tcl/tk)學習資源Erlang官方網站
ErlangChinaErlangMailistErlangPlanetErlang非業余研究ErlangDisplay
開源項目ejabberd-theErlangJabber/XMPPdaemon
RabbitMQ-AMQPserverCouchDB-schema-freedocumentdatabaseTsung-multi-protocoldistributedloadtesting
Scalaris-distributedkey-valuestoreDisco-MapReduceFramework
Mochiweb-PowerfulHttpServerTookit自己動手發起erlang開源項目!案例AXD301高并發的電信交換機99.9999999%可靠性(~3ms故障/年)超過100萬行Erlang代碼軟實時系統高容錯案例WEBIM后臺(mochiweb)
7+百萬活躍用戶~100serverajax+comet(long-polling)更多應用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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 招商政策與公共服務滿意度分析-全面剖析
- 鐵路投資效益分析-全面剖析
- 音響設備智能化升級-全面剖析
- 2024年中國工商銀行廣東陽江支行春季校招筆試題帶答案
- 數字化轉型在青年發展中的影響-全面剖析
- 腦科學與終身學習體系的構建探索-全面剖析
- 2025自衛用品購銷合同書
- 2025數據中心空調系統采購與安裝合同
- 2025湖北省煤炭買賣合同
- 2025店面轉讓合同協議書
- 新146道100以內四個數字的加減法混合題目
- 《機器人技術應用項目教程》(第二版)課件 2-項目三 威綸觸摸屏的組態設計 任務一 觸摸屏的組態與連接;觸摸屏控制氣缸推動
- 中考英語688高頻詞大綱詞頻表
- YY-T 0954-2015 無源外科植入物-I型膠原蛋白植入劑
- 12-2017-2021年陜西中考數學真題分類匯編之統計與概率
- 2024年時事政治熱點題庫200道含完整答案(必刷)
- 屈光性白內障手術發展
- 基于物聯網的智能衣柜
- 醫院政工查房
- 緩和醫療-以死觀生的生活智慧智慧樹知到期末考試答案2024年
- 基于STM32的智能避障循跡小車系統設計答辯模板
評論
0/150
提交評論