Erlang开发及应用

7,421 views

Published on

Published in: Technology
1 Comment
23 Likes
Statistics
Notes
  • quite good summary.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
7,421
On SlideShare
0
From Embeds
0
Number of Embeds
41
Actions
Shares
0
Downloads
211
Comments
1
Likes
23
Embeds 0
No embeds

No notes for slide

Erlang开发及应用

  1. 1. Erlang 开发及应用 [email_address]
  2. 2. What is Erlang? <ul><ul><li>  ER icsson LANG uage? </li></ul></ul><ul><ul><li>函数式编程语言 (FP) </li></ul></ul><ul><ul><li>面向并发 (OC), 基于消息 </li></ul></ul><ul><ul><li>Ericsson 创建 , 最初用于电信系统开发 </li></ul></ul><ul><ul><li>成熟 , 稳定 , 具有 20 多年历史 </li></ul></ul><ul><ul><li>适于电信系统 , 分布式系统 , 高并发服务器 </li></ul></ul><ul><ul><li>Open Source, 跨平台 , GC </li></ul></ul><ul><li>       不适于底层系统开发 </li></ul>
  3. 3. History <ul><ul><li>1980s Ericsson 实验室思考如何轻松开发电信系统应用 </li></ul></ul><ul><ul><li>1987 年左右 , Erlang 浮出水面 </li></ul></ul><ul><ul><li>1989 年 JAM 虚拟机 C 语言实现  </li></ul></ul><ul><ul><li>1996 年 OTP 项目启动 , 融合开发经验 , 提供易用 , 强大的 Erlang 开发库 </li></ul></ul><ul><ul><li>1998 年开源 </li></ul></ul><ul><ul><li>2007 年《 Programming Erlang 》出版 </li></ul></ul><ul><ul><li>目前版本 Erlang R13B1 (5.7.2) </li></ul></ul>
  4. 4. Erlang 优势 <ul><ul><li>多核 SMP 支持 </li></ul></ul><ul><ul><li>内建分布式支持 </li></ul></ul><ul><ul><li>基于轻量进程及消息的高并发模型 </li></ul></ul><ul><ul><li>代码热替换 </li></ul></ul><ul><ul><li>开发速度快 , 高性能 , 高稳定性 </li></ul></ul><ul><ul><li>FP 编程 , 代码灵活高效 , 副作用小 </li></ul></ul><ul><ul><li>丰富的分析及监控程序 </li></ul></ul><ul><ul><li>经过商业产品 , 长久大规模验证 </li></ul></ul><ul><ul><li>OpenSource, 代码面前无秘密 </li></ul></ul>
  5. 5. Erlang Hello World <ul><li>代码 hello.erl: </li></ul><ul><li>1 -module(hello). </li></ul><ul><li>2 -compile([export_all]). </li></ul><ul><li>3 4 main() -> </li></ul><ul><li>5    io:format(&quot;hello world!~n&quot;). </li></ul><ul><li>编译 :  </li></ul><ul><li>$ erlc hello.erl </li></ul><ul><li>运行 :  </li></ul><ul><li>$ erl </li></ul><ul><li>Eshell V5.7.1  (abort with ^G) 1> hello:main(). hello world! ok   </li></ul><ul><li>  </li></ul>
  6. 6. Erlang Hello World CON'T <ul><li>1 -module(hello). </li></ul><ul><li>声明模块名称 , 其必须和文件名一致 . 模块是 Erlang 项目中代码组织的基本方式 . </li></ul><ul><li>2 -compile([export_all]). </li></ul><ul><li>指明编译选项 ,export_all 用来导出所有本模块中的函数 ,exported function 是模块的接口 , 其他模块只能调用 exported function </li></ul><ul><li>4 main() -> </li></ul><ul><li>为函数头 (head), 包含函数名称和参数 , 后紧随一个 '->' 分割符 </li></ul><ul><li>5    io:format(&quot;hello world!~n&quot;). </li></ul><ul><li>为函数体 (body), 包含 Erlang 表达式 , 这里调用 io 模块的 format 函数在默认输出中打印 &quot;hello world!&quot; </li></ul><ul><li>在上面的运行结果中 , 最后有一个 &quot;ok&quot;, 这是 io:format/1 的返回值 , 表示打印成功 ,Erlang 中任何函数都有返回值 . </li></ul>
  7. 7. Erlang 语法 <ul><ul><li>Data Types </li></ul></ul><ul><li>     8 种基本类型 </li></ul><ul><ul><li>integer - 4,  -4, 2#100, 16#4, 920828990801238101010.. </li></ul></ul><ul><ul><li>float - 3.0, 3.5e2, 6.5e-2, (IEEE754 64bit) </li></ul></ul><ul><ul><li>atom - hello, your_name, root@host, 'IsAtom' </li></ul></ul><ul><ul><li>binary - <<&quot;some text&quot;>> </li></ul></ul><ul><ul><li>reference - make_ref(), 一个随机值 </li></ul></ul><ul><ul><li>fun - fun() -> some_expr end </li></ul></ul><ul><ul><li>port - 与外部应用进行交互的接口 </li></ul></ul><ul><ul><li>pid - process identifier, 用来操作 process </li></ul></ul><ul><li>     2 种复合类型 </li></ul><ul><ul><li>tuple - {foo, male, 28, china, <<&quot;i love erlang&quot;>>}  </li></ul></ul><ul><ul><li>list - [{ip, any}, {port, 1234}, binary] </li></ul></ul>
  8. 8. Erlang 语法 CON'T <ul><ul><li>Pattern Match </li></ul></ul><ul><li>    语言层级的模式匹配 , 代码更加简洁 . </li></ul><ul><li>    适用于函数调用 , case, receive, try 表达式及 &quot;=&quot; 操作 </li></ul><ul><li>    case Value of </li></ul><ul><li>       N when is_integer(N) -> N; </li></ul><ul><li>       _ when is_list(Value) -> list_to_integer(Value) </li></ul><ul><li>    end </li></ul><ul><ul><li>  变量 </li></ul></ul><ul><ul><li>大写字母或 &quot;_&quot; 开头 , 只能包含数字 , 字母 ,&quot;_&quot;, &quot;@&quot;. </li></ul></ul><ul><ul><li>如 X, Name1, _Phone, _, Host@ </li></ul></ul><ul><ul><li>变量分为 Unbound 和 Bound, Unbound 变量只能用在模式匹配中 . </li></ul></ul><ul><ul><li>变量 Bound 后 ,Value 就不可修改  </li></ul></ul><ul><ul><li>变量只能单次赋值 ( 并发及调试考虑 ) </li></ul></ul><ul><ul><li>N = 3 (ok) </li></ul></ul><ul><ul><li>N = 4 ( oops! not match)      </li></ul></ul><ul><li>    </li></ul>
  9. 9. Erlang 语法 CON'T <ul><ul><li>Binary 匹配 </li></ul></ul><ul><ul><li>使用 binary 可以轻松的实现二进制协议 . </li></ul></ul><ul><ul><li>(1) 解析 IP 包 : </li></ul></ul><ul><ul><li>-define(IP_VERSION, 4). </li></ul></ul><ul><ul><li>-define(IP_MIN_HDR_LEN, 5). ... DgramSize = size(Dgram), case Dgram of <<?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>> when HLen >= 5, 4*HLen =< DgramSize -> OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN), <<Opts:OptsLen/binary,Data/binary>> = RestDgram, </li></ul></ul><ul><li>    </li></ul>
  10. 10. Erlang 语法 CON'T <ul><ul><li>  (2) 自定义协议 </li></ul></ul><ul><ul><li>假如我们 定义了一个协议 , 前 2 bytes(16 位 ) 标记消息体的长度 , 后面为消息体 , 最后为占用 1 个 byte 的结尾符 0xef, 示意图如下 : </li></ul></ul><ul><ul><li>[--- length ---][--------- payload ------][ef] </li></ul></ul><ul><ul><li>|------ 2 -------|---------- Length -------|-1-| ( 单位 byte) </li></ul></ul><ul><ul><li>则对应的 binary 匹配表达式如下 : </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>Packet = ... </li></ul></ul><ul><ul><li>case Packet of </li></ul></ul><ul><ul><li>    <<Len:16,  PayLoad:Len/binary, 16#ef>> -> </li></ul></ul><ul><ul><li>        {body, PayLoad}; </li></ul></ul><ul><ul><li>    _ -> </li></ul></ul><ul><ul><li>        {error, invalid_packet} </li></ul></ul><ul><ul><li>end. </li></ul></ul><ul><li>    </li></ul>
  11. 11. Erlang 语法 CON'T <ul><ul><li>序列化与反序列化 </li></ul></ul><ul><ul><li>Erlang 中序列化非常简单 </li></ul></ul><ul><ul><li>term_to_binary/1 - 将任意数据转化为二进制序列 </li></ul></ul><ul><ul><li>binary_to_term/1 - 将编码的二进制数据转化为 Erlang 数据 </li></ul></ul><ul><ul><li>比如 : </li></ul></ul><ul><ul><li>Obj = {apple, {price, 2.0}, {origin, shandong}}, </li></ul></ul><ul><ul><li>Bin = term_to_binary(Obj), </li></ul></ul><ul><ul><li>Obj = binary_to_term(Bin) </li></ul></ul><ul><ul><li>CouchDB 中大量使用 erlang 的序列化相关函数,完成数据的存储与加载 . </li></ul></ul><ul><li>    </li></ul>
  12. 12. Erlang 语法 CON'T <ul><ul><li>函数 </li></ul></ul><ul><li>     一切皆函数 , 每个调用都有 return, 函数可以作为基本数 </li></ul><ul><li>    据类型 . </li></ul><ul><ul><li>作为返回值 : </li></ul></ul><ul><ul><li>op_fun('+') -> </li></ul></ul><ul><ul><li>    fun(N1, N2) -> N1 + N2 end; </li></ul></ul><ul><ul><li>op_fun('-') -> </li></ul></ul><ul><ul><li>     fun(N1, N2) -> N1 - N2 end. </li></ul></ul><ul><ul><li>作为参数 : </li></ul></ul><ul><ul><li>> FIsEven = fun(E) -> E band 2#1 =:= 0 end. </li></ul></ul><ul><ul><li>> lists:filter(FIsEven, [1, 2, 3, 4, 5, 6]). </li></ul></ul><ul><ul><li>> [2, 4, 6] </li></ul></ul><ul><li>    </li></ul>
  13. 13. Erlang 语法 CON'T <ul><ul><li>Tail Recursion 尾递归 </li></ul></ul><ul><ul><li>Erlang 中没有 for, while 关键字 </li></ul></ul><ul><ul><li>可以利用递归实现循环 </li></ul></ul><ul><ul><li>在 server 开发中 , 确保使用尾递归 : </li></ul></ul><ul><ul><li>server_loop(Args) -> </li></ul></ul><ul><ul><li>    ...some action... </li></ul></ul><ul><ul><li>    server_loop(Args). </li></ul></ul><ul><ul><li>使用尾递归 , 可以消耗很少的内存 , 仅仅是一个地址跳转 . </li></ul></ul><ul><ul><li>server_loop(Args) -> </li></ul></ul><ul><ul><li>    ...some action... </li></ul></ul><ul><ul><li>    server_loop(Args), </li></ul></ul><ul><ul><li>    other_fun(). </li></ul></ul>
  14. 14. Erlang 语法 CON'T <ul><ul><li>  发送 Message &quot;!&quot; </li></ul></ul><ul><li>     基于消息通信 ,No Lock! No Shared Memroy!      Pid ! {msg, &quot;hello, I love erlang&quot;} </li></ul><ul><li>     向 Pid( 本地或远程主机 ) 代表的进程发送消息 </li></ul><ul><ul><li>receive </li></ul></ul>1, 阻塞等待任意消息 : receive      Msg -> ok end 3, 等待消息 , 超时为 5 sec: receive       Msg -> ok after 5000 ->      timeout end 2, 实现 sleep: receive after Time ->     ok end 4, 检测是否存在消息 : receive      SomeMsg -> exist after 0 ->       no_exist end
  15. 15. Erlang 并发 <ul><li>关于 Process </li></ul><ul><ul><li>每个 Process 拥有一个 mailbox ,保存消息 </li></ul></ul><ul><ul><li>Processes 之间通过发送异步 Message 进行交互 , 无共享状态 </li></ul></ul><ul><ul><li>轻量 , 兼有 OS Process 的隔离及 OS Thread 的高效 </li></ul></ul><ul><ul><li>Process 具有自己 Stack, Heap, GC </li></ul></ul><ul><ul><li>Process 可以位于 Local, 也可以位于 Remote Machine </li></ul></ul><ul><ul><li>Process 能够进行多种形式的管理及控制 (link, monitor, exit signal) </li></ul></ul><ul><ul><li>Process 为 erlang 高并发 , 高容错 , 分布式的基础 </li></ul></ul><ul><ul><li>并发 Process 数 : default 32768, max 268435456 </li></ul></ul>
  16. 16. Erlang 并发 CON'T <ul><ul><li>创建 Process </li></ul></ul><ul><ul><li>spawn(Fun), 比如 </li></ul></ul><ul><ul><li>> spawn(fun() -> io:format(&quot;i'm ~p~n&quot;, [self()]) end). </li></ul></ul><ul><ul><li>i'm <0.33.0> <0.39.0> </li></ul></ul><ul><ul><li>spawn(Mod, Fun, Args), 比如 </li></ul></ul><ul><ul><li>> spawn(io, format, [&quot;i'm ~p~n&quot;, [self()]]).  i'm <0.33.0> <0.41.0> </li></ul></ul><ul><ul><li>spawn_link,  spawn_opt, spawn_monitor ... </li></ul></ul><ul><ul><li>销毁 Process </li></ul></ul><ul><ul><li>进程内部调用 exit(Reason), 比如 exit(normal), 正常退出 </li></ul></ul><ul><ul><li>进程内部发生异常导致程序退出 </li></ul></ul><ul><ul><li>其他进程调用 exit(PidBeTerminate, Reason) </li></ul></ul><ul><li>  </li></ul>
  17. 17. Erlang 并发 CON'T <ul><li>基于 Process 的 http server 框架 </li></ul><ul><li>(one loop process, per conection per process): </li></ul><ul><li>  </li></ul><ul><li>setup up listen socket, </li></ul><ul><li>spawn(listen_process). </li></ul><ul><li>in listen_process: </li></ul><ul><li>   while can accept new  client connect </li></ul><ul><li>        accept , </li></ul><ul><li>        spawn(client_process) </li></ul><ul><li>   loop </li></ul><ul><li>in client_process: </li></ul><ul><li>    process protocol, </li></ul><ul><li>    close socket. </li></ul><ul><li>     </li></ul>
  18. 18. Erlang 并发 CON'T <ul><li>使用 Erlang 我们可以 : </li></ul><ul><li>以清晰的风格开发高并发的应用 </li></ul><ul><li>  </li></ul><ul><li>我们将不在受困于 : </li></ul><ul><li>线程池的复杂 </li></ul><ul><li>死锁 , 竞赛的窘迫 </li></ul><ul><li>内存泄露 </li></ul><ul><li>局部问题 , 导致的全局崩溃 </li></ul><ul><li>与跨平台多核 SMP 的格格不入 </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>
  19. 19. Erlang 分布式 <ul><ul><li>Erlang Node 是分布式通讯的基本单元 , 可以位于同一机器 or 多台机器 , 实现了原语级的节点通讯 </li></ul></ul><ul><ul><li>Erlang Node 通过 erl -sname Name  or erlang -name Name 启动 , 同一台机器可以启动多个 Node </li></ul></ul><ul><ul><li>每台机器上启动 Erlang Node 时 , 都会启动一个 epmd(Erlang Port Mapper Daemon, port 4396), 用来进行 Node 和 Machine 之间的映射 </li></ul></ul><ul><ul><li>不同机器的 Node 之间通过 Tcp 连接进行 Message 传输 ( 可以自定义分布式通讯实现 , 如通过 ssh) </li></ul></ul><ul><ul><li>global 维护一个全局的 Nodes 网络 </li></ul></ul><ul><ul><li>spawn[_link|_opt] 都具有分布式版本 , 可以再其他节点创建 Process </li></ul></ul>
  20. 20. Erlang 分布式 CON'T <ul><ul><li>rpc 模块可以在其他 Node 上执行操作 </li></ul></ul><ul><ul><li>slave, remsh, remote shell 等方式启动 , 连接 Erlang Node </li></ul></ul><ul><ul><li>Erlang 中进程具有位置透明性 </li></ul></ul><ul><ul><li>通过 message 及 receive 表达式 , 轻松实现同步 or 异步 , timeout 等网络通信中多种机制 </li></ul></ul><ul><ul><li>Erlang 本身提供 tcp,udp 等常规的网络编程方式 </li></ul></ul><ul><ul><li>使用 Erlang 内建分布式机制 , 可以快速开发多种应用 , 也可以基于 socket 开发各种专有应用 </li></ul></ul>
  21. 21. Erlang 分布式 CON'T
  22. 22. Erlang 分布式 CON'T <ul><li>节点 A2 连接节点 B2 步骤 </li></ul><ul><ul><li>Node A2, B2 启动 , 绑定一个本机端口 , 并注册到本机的 epmd(default port 4396) </li></ul></ul><ul><ul><li>A2 连接 HostB epmd, 请求获取 B2 节点的绑定端口 </li></ul></ul><ul><ul><li>HostB epmd 将 B2 的 bind port 及 dist 协议版本等信息返回给 A2 </li></ul></ul><ul><ul><li>  A2 与 B2 协商 , 建立 tcp 连接 , 如果连接成功 , 维护一个 tick, 来定期检测 B2 节点  </li></ul></ul><ul><ul><li>A2 与 B2 节点之间的消息 , 通过此连接进行发送 </li></ul></ul><ul><li>  </li></ul>
  23. 23. Erlang OTP <ul><ul><li>OTP(Open Telecom Platform) ,其定义了一系列项目开发中需要的模式及部署升级策略,为提高开发效率,构建高效,稳定系统提供了巨大的帮助。 </li></ul></ul><ul><ul><li>同最初时的专有电信平台应用已没有太多关系 </li></ul></ul><ul><ul><li>当前系统都是采用 OTP 进行开发 </li></ul></ul><ul><ul><li>Erlang 中各种 lib 都是基于 OTP 开发 </li></ul></ul><ul><ul><li>可以理解成某种轻量的框架,或者具体化的设计模式 </li></ul></ul><ul><ul><li>behaviours 包含 :application, supervisor, gen_server, gen_fsm, gen_event </li></ul></ul><ul><ul><li>application , release , release handling </li></ul></ul><ul><ul><li>提供应用的部署,升级,回退等实现 </li></ul></ul>
  24. 24. Erlang OTP CON'T <ul><li>Behaviours </li></ul><ul><li>通过定义一些简单的 callback 模块实现特定功能 . </li></ul><ul><ul><li>application - 定义 application ,实现某种功能,由其他 behaviours 组成 </li></ul></ul><ul><ul><li>supervisor - 定义一个 supervisor tree ,实现各种策略的任务重启机制 </li></ul></ul><ul><ul><li>gen_server - 定义一个通用的 server 模型,一个 process loop ,提供同步异步接口 </li></ul></ul><ul><ul><li>gen_fsm - 实现一个状态机 </li></ul></ul><ul><ul><li>gen_event - 实现一个 event manager 及 event handler 模型 </li></ul></ul>
  25. 25. 与其它语言的交互 <ul><ul><li>External App </li></ul></ul><ul><ul><li>外部应用崩溃不会影响 Erlang 虚拟机 </li></ul></ul><ul><ul><ul><li>Ports - 通过 port 与外部应用交互 (stdin/stdout) </li></ul></ul></ul><ul><ul><ul><li>Erl_Iterface - 提供 c 的封装,方便开发 port 应用 </li></ul></ul></ul><ul><ul><li>Link in Driver </li></ul></ul><ul><ul><li>shared library (SO in Unix, DLL in Windows) ,影响 Erlang 虚拟机稳定性(不推荐) </li></ul></ul><ul><ul><li>Port dirvers - 提供 c 封装,运行在 erlang 虚拟机内部 </li></ul></ul><ul><ul><li>C Nodes </li></ul></ul><ul><ul><li>遵照 erlang 的交互协议, 使用 c 实现的一个 erlang node </li></ul></ul><ul><ul><li>Jinterface </li></ul></ul><ul><ul><li>提供一系列与 Erlang 进行交互的 Java 包 </li></ul></ul>
  26. 26. Erlang 代码片段 <ul><ul><li>求某个数的阶乘 </li></ul></ul><ul><li>                  factorial(0) -> 1;          factorial(N) -> N * factorial(N-1). </li></ul><ul><ul><li>获取远程机器的 issue 信息( linux) </li></ul></ul><ul><li>       -module(issue).        -compile([export_all]). </li></ul><ul><li>       %% start server        server() ->             register(issue_server, spawn(fun server_loop/0)).        server_loop() ->             receive                   {From, {get, issue}} ->                   From ! {issue, get_issue()};             _ ->                 ok             end,            server_loop(). </li></ul><ul><li>     </li></ul>
  27. 27. Erlang 代码片段 CON't <ul><li>get_issue() ->     {ok, Bin} = file:read_file(&quot;/etc/issue&quot;),     Bin. %% start client client(ServerNode) ->     true = net_kernel:connect_node(ServerNode),     {issue_server, ServerNode} ! {self(), {get, issue}},     receive         {issue, Issue} ->             io:format(&quot;server issue:~s~n&quot;, [Issue])     after 1000 ->             io:format(&quot;receive issue time out~n&quot;)     end. </li></ul><ul><li>调用: $ erl -sname server (server@litao)1> issue:server(). true $ erl -sname client (client@litao)1> issue:client('server@litao'). server issue:Ubuntu 9.04 l </li></ul><ul><li>     </li></ul>
  28. 28. 产品开发流程 <ul><ul><li>架构设计 </li></ul></ul><ul><ul><li>单台 or 分布式? Master-Slave or Grid?  Monitor,     Failover, Net Comunication, Database, Replica ... </li></ul></ul><ul><ul><li>OTP Behaviour how many application? use supervisor, gen_server, gen_fsm, gen_event </li></ul></ul><ul><ul><li>Coding, 及单元测试用例 . 每个 module 都经过测试 (eunit) </li></ul></ul><ul><ul><li>编写系统测试框架,覆盖测试,确保系统正确 (common test) </li></ul></ul><ul><ul><li>压力测试,分析性能瓶颈,进行优化 (fprof) </li></ul></ul><ul><ul><li>系统上线,监控功能 (ganglia, nagios, monit) </li></ul></ul><ul><ul><li>新的功能或需求,重复 2-7 </li></ul></ul>
  29. 29. 一些工具 <ul><li>appmon - OTP application 监控工具 </li></ul><ul><li>cover -  erlang 代码覆盖测试 </li></ul><ul><li>ntop - 显示 Node 中进程信息 (unix top) </li></ul><ul><li>make - erlang 中的 make 工具 </li></ul><ul><li>pman - erlang 中进程管理器 </li></ul><ul><li>tv - ets 和 mnesia 查看器 </li></ul><ul><li>fprof -  erlang 系统性能分析 </li></ul><ul><li>common_test - erlang 测试框架 </li></ul><ul><li>dialyzer - 代码静态分析 </li></ul><ul><li>debugger - 单步调试工具,基于 (tcl/tk ) </li></ul>
  30. 30. 学习资源 <ul><li>Erlang 官方网站 </li></ul><ul><li>http://www.erlang.org/doc </li></ul><ul><li>Erlang China </li></ul><ul><li>http://www.erlang-china.org/ </li></ul><ul><li>Erlang Mailist </li></ul><ul><li>http://www.nabble.com/Erlang-Questions-f14096.html </li></ul><ul><li>Erlang Planet </li></ul><ul><li>http://www.planeterlang.org/ </li></ul><ul><li>Erlang 非业余研究 </li></ul><ul><li>http://mryufeng.javaeye.com/ </li></ul><ul><li>Erlang Display </li></ul><ul><li>http://erlangdisplay.javaeye.com/ </li></ul>
  31. 31. 开源项目 <ul><li>ejabberd - the Erlang Jabber/XMPP daemon </li></ul><ul><li>RabbitMQ - AMQP server </li></ul><ul><li>CouchDB - schema-free document database </li></ul><ul><li>Tsung - multi-protocol distributed load testing </li></ul><ul><li>Scalaris - distributed key-value store </li></ul><ul><li>Disco - MapReduce Framework </li></ul><ul><li>Mochiweb - Powerful Http Server Tookit </li></ul><ul><li>自己动手发起 erlang 开源项目 ! </li></ul>
  32. 32. 案例 <ul><ul><li>AXD301 </li></ul></ul><ul><ul><li>高并发的电信交换机 </li></ul></ul><ul><ul><li>99.9999999% 可靠性 (~3ms 故障 / 年 ) </li></ul></ul><ul><ul><li>超过 100 万行 Erlang 代码 </li></ul></ul><ul><ul><li>软实时系统 </li></ul></ul><ul><ul><li>高容错 </li></ul></ul>
  33. 33. 案例 <ul><ul><li>WEB IM 后台 (mochiweb) </li></ul></ul><ul><ul><li>  7+ 百万活跃用户 </li></ul></ul><ul><ul><li>~ 100 server </li></ul></ul><ul><ul><li>ajax + comet(long-polling) </li></ul></ul>
  34. 34. 更多应用

×