
书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:
一、Erlang并发哲学
- “Erlang的并发单位是轻量级进程(Lightweight Process),每进程独立堆栈,由调度器管理,切换成本极低。”
- “共享无状态(Share Nothing):进程间仅通过消息传递通信,避免锁与竞态条件。”
二、进程与消息
- “
spawn
创建进程,!
发送异步消息,receive
模式匹配处理消息,支持超时(after 5000 -> timeout
)。” - “进程链接(
link
)与监控(monitor
):前者双向生命周期绑定,后者单向异步通知。”
三、OTP设计原则
- “OTP行为的四大支柱:GenServer(通用服务器)、Supervisor(监督树)、Application(应用封装)、GenEvent(事件处理)。”
- “GenServer回调模块必须实现
init/1
、handle_call/3
(同步请求)、handle_cast/2
(异步请求)。”
四、容错与监督
- **“监督策略(Supervision Strategy):
one_for_one
:子进程独立重启;one_for_all
:任一子进程崩溃重启所有。”**
- “进程沙盒(Process Isolation):一个进程崩溃不会影响其他进程,由监督树处理恢复。”
五、分布式Erlang
- “节点间通信:
node()
获取当前节点名,{Name, Node} ! Msg
跨节点发送消息。” - “CAP权衡:Erlang默认选择可用性(AP),通过最终一致性解决网络分区问题。”
六、热代码升级
- “代码热加载:
.beam
模块可动态替换,运行中进程通过sys:suspend
/sys:change_code
迁移状态。”
七、性能优化
- “ETS(Erlang Term Storage)提供进程共享的内存表,但需手动处理并发访问(如
ets:safe_fixtable
)。” - “二进制处理(
<<...>>
)比列表操作高效,适合协议解析(如<<Len:32, Data:Len/binary>>
)。”
八、模式匹配威力
- “
case
、receive
和函数头中的模式匹配是Erlang的核心抽象工具,替代传统条件语句。”
九、调试与追踪
- “
dbg
模块动态追踪函数调用,sys:trace
监控GenServer消息流。”
十、设计哲学
- “面向错误编程(Let it crash):集中处理错误而非防御性检查,监督树负责恢复。”
- “幂等设计:消息处理函数应可重复执行,避免副作用(如重复扣款)。”
附:OTP应用结构
- **“标准OTP应用目录结构:
src/
:源代码;ebin/
:编译后的.beam
;priv/
:静态资源;.app
文件描述元数据。”**
经典问题解决方案
- “进程字典(
get/put
)应避免使用——破坏可预测性,改用GenServer状态或ETS。” - **“大规模系统设计:
- 水平扩展:无状态服务多节点部署;
- 垂直扩展:关键服务分配更多调度器。”**