基于Erlang/OTP构建大规模实时系统


基于 Erlang/OTP 构建⼤规模实时系统 http://yunba.io 关于我 • 连续创业者 • Yunba.io 创始⼈, CEO • JPush 创始⼈,原 CTO • @Tiger_张虎 2 议程 • Yunba.io 实时系统架构简介 • Erlang/OTP 对构建⼤并发系统的⽀持 • C/C++ 团队切换到 Erlang 3 关于 Yunba.io • 云巴: Cloud Bus – 云端实时系统 • MQTT as a service – 智能硬件、智能⼿机、 PC、 Mac • Socket.io as a service – Web、 Web App 4 Yunba.io 架构 • ⽀持亿级⽤户 • 在线弹性扩容 – 云主机友好 • 部分机器宕机不影响业务 5 Yunba.io 架构 Frontend 订阅关系服务 全局路由表 请求 应答 处理 
 过程 统计服务 离线消息存储 FrontendFrontendFrontend 主逻辑 ⾯临的问题 • ⼤并发 • 软实时 – 秒内延迟 • ⾼可⽤ – 单点失效 – IDC失效 • 线性扩容 7 ⼤并发 • 异步 IO – Libev/Nginx, node.js • 轻量级进程 – Erlang, Go, Akka 8 异步 IO 框架 • Libev/Nginx – 运⾏效率⾼ – 开发成本⾮常⾼ – 适⽤于业务逻辑简单,外部依赖少 • Node.js – 运⾏效率⼀般 – 开发成本低 – 承受不了很⼤并发 9 异步 IO 框架 的问题 • CPU 时间分配公平性不能保障 – 部分繁忙的任务造成其他任务饥饿 • 损失软实时性 – 同⼀个 process 运⾏, 错误隔离很弱 10 Go/Akka • Go/Akka – 与 Erlang 类似的轻量级进程模型 – Akka 可以直接使⽤ Java 库 – 调度公平性 – 全局 GC • 缺少类似 OTP 的框架 11 Erlang 特性 • 函数式语⾔ • 轻量级进程 – 独⽴⾝份、独⽴状态 • 抢占式调度 – Reduction • 进程独⽴ GC • 分布式⽀持 12 函数式语⾔ • 关注于逻辑描述 • 模式匹配 (Pattern matching) • 代码可读性好? 13 -module(fact). -export([fac/1]). fac(N) when N > 1 -> N * fac(N-1); fac(1) -> 1. 轻量级进程 • 单机可以维持百万级进程 • COP (Concurrency Oriented Programming) • 通过消息通讯 • 不共享数据 • Pid/Name 14 调度器 • 公平调度,软实时系统关键之⼀ – 部分任务占⽤过多资源 – 其他任务饥饿,实时系统失效 • Reduction budget, 2000 – 函数调⽤、 BIF调⽤ – ETS、发消息、表达式匹配 • 异步 IO 框架的问题 15 调度器 • 进程数怎么分配? – 快的模块进程数少 – 慢的模块进程数多 • 监控 mailbox length – 哪些进程的 mailbox 过⻓? • Profiling – fprof – systemtap,⽤源码编译 16 内存垃圾回收 GC • 进程独⽴垃圾回收 • 垃圾回收时只有⼀个进程阻塞 – Go/Akka/Java GC 抖动问题 • 软实时系统的另⼀个关键 17 错误处理 • 错误⽆法避免 • 及时发现和恢复 18 P1 P2 P3 P4 错误处理 • 错误⽆法避免 • 及时发现和恢复 19 P1 P2 P3 P4 {‘EXIT’, P4, …} 错误处理 • 错误⽆法避免 • 及时发现和恢复 20 P1 P2 P3 P4 {‘EXIT’, P4, …} {‘EXIT’, P2, …} {‘EXIT’, P2, …} 错误处理 • 错误⽆法避免 • 及时发现和恢复 21 P1 P2 P3 {‘EXIT’, P2, …} {‘EXIT’, P2, …} receive {EXIT ,Pid,...} -> ... end 错误处理 • 分层结构 22 Supervisors Workers 分布式⽀持 • 节点原⽣⽀持互联 – 与其他节点的进程直接交互 – Pg2/poolboy • -setcookie 23 分布式⽀持 24 A B C Node A Node B B ! Msg C ! Msg 对外接⼝ Port 25 ⽤其他语⾔写的 ProcessA Erlang Node C 程序或其他 对外接⼝ Port • Erlang – 结点管理 – 路由调度 • C/C++ – 算法 – 存储 • Couchbase: Erlang + memcached 26 OTP • Application • Supervisor • Worker – gen_server – gen_event – gen_fsm 27 OTP • gen_server – RPC clint-server – call/cast/info • gen_event – event/handler • gen_fsm 28 gen_server 场景 • 维持⻓链接 • 管理外部依赖部件 – rabbitmq/redis/couchbase/mysql… • RESTful API • Socket.io API 29 gen_event 场景 • ⽇志系统 – file_handler – syslog_handler • 实时统计系统 – ⼀个事件多维度统计 30 gen_fsm 场景 • 处理步骤复杂的请求 – 流程复杂,两次交互以后 – 时间复杂,需要后台异步处理 • 海量事务 – ⼀次发布千万级个对象 – 分⽚,上万个 fsm 被创建 • fsm 本⾝被监控 31 陷阱 • list_to_atom/1 • http://www.erlang.org/doc/efficiency_guide/ commoncaveats.html 32 Riak Core下⼀个巨⼈? • Riak Core:对等⺴,分布式 key 分⽚ • 基于 Amazon Dynamo Paper,已经出现⼀段 时间 • Couchbase, Riak, Aerospike – 节点对等 – 线性扩容 – 持续运⾏ – 最终⼀致 33 Riak Core • 任何基于 Key 的系统 • Riak Core + X – Redis? – … 34 迁移到 Erlang • 选择当前最合适的技术/平台 • 整个团队 Erlang 经验为零 35 迁移到 Erlang • 语法的学习,容易 • 阅读开源项⺫代码,进阶 • 掌握调试、性能调优⼯具,进阶 • 理解 Erlang 虚拟机⼯作原理 – 熟悉操作系统 原理 36 迁移到 Erlang • Code Review – 每⼀⾏、每⼀个命名 • eunit • 集成测试 • Appmon/observer • Mailbox 监控 37 迁移到 Erlang • 招不到会 Erlang 的⼈⽽放弃 Erlang? – 团队 Leader 的认知 – 不要只 试图招会的⼈,⽽是招能学会的⼈ 38 39 谢谢 Q & A 40 @InfoQ infoqchina
还剩39页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

ee37

贡献于2015-07-05

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf