选一门语言,走到作品
Elixir 和 Erlang 分开讲。每条分成 Scratch、Foundation、Intermediate、Project 四段。Foundation 学完,就能进入 BEAM 主线。
先从值、类型和函数开始。语法读顺以后,再看进程怎样合作。Elixir 和 Erlang 各有一条从零路线。任选一条,不必一起学。
语言线负责代码、测试和项目工具。BEAM 主线负责并发、失败与恢复。做完综合练习,再去 Case Chat 看这些选择怎样落进一个语音服务。
Elixir 和 Erlang 分开讲。每条分成 Scratch、Foundation、Intermediate、Project 四段。Foundation 学完,就能进入 BEAM 主线。
每站从一个故障开始:回复错配、mailbox 堆积、重启范围、资源耗尽。代码可在 Elixir 与 Erlang 之间切换。
把有界队列、监督树、幂等、重试与节点断线放进同一个项目。用故障实验验收,不靠口头保证。
沿着一次语音会话读完整项目。先看全貌,再逐章追 mix、监督树、WebSocket、录音进程和浏览器代码。重点不在抄写,而在看每个选择解决了什么问题。
每一课都有代码可改。结果和预想不同时,先看输出,再只改一个地方。这样容易找到原因。
每个新概念都有一小段代码,可以放进 IEx 或 erl 运行。页面动画会把消息传递画出来。
同一个任务,分别用 Elixir 和 Erlang 来写。写法不同,都运行在 BEAM 上。
做一道小题,翻译一段代码,再改一个条件。答错没关系,结果会告诉你下一步该试什么。
让回信迟到,让 mailbox 堆积,让进程退出。观察结果,也记住这个实验不能说明什么。
学过一门,不必把另一门从头重学。先认出相同的值、模式和函数,再看它们怎样在 BEAM 上使用进程与消息。
先用学过的语言看清数据和函数。
找相同的 atom、tuple、模式和模块。
进程、消息和监督,从这里一起学。
:ok同一个标签 atomokFoo.bar()找到同一个模块'Elixir.Foo':bar():lists.reverse(xs)借用同一个 Erlang 工具lists:reverse(Xs)fn x -> x * 2 end都在创建匿名函数fun(X) -> X * 2 endGenServer同一个 OTP behaviourgen_server核心有 7 站,另有 2 站语言跳级复习和 2 站双语扩展。先用熟悉的语言走完进程、OTP、容量与综合项目;需要互操作时,再补共享 term 与 adapter。
先确认工具能跑,再用第一个进程分清函数、状态、PID 与消息。
只在需要时补另一门语言。单语言学习者不必在这里停下。
从迟到回复、mailbox 堆积、重启范围和容量上限进入 OTP。
并发请求的回复会迟到、乱序,服务进程也可能退出时,怎样保证每个调用者拿到自己的结果?
把手写循环改成 GenServer 后,怎样划分 call 与 cast,并阻止慢任务把 mailbox 塞满?
Registry、worker supervisor 与 dispatcher 有依赖时,怎样选择重启策略,让故障恢复充分又不过度?
突发一万条 URL 检查请求时,怎样限制运行数与等待数,并清楚返回 timeout、失败或 busy?
核心从节点断线直达综合项目。需要双语协作时,再走共享 term 与 adapter 支线。
远程 worker 在请求执行中途断线时,调用者得到什么结果,系统怎样标记 stale、重试并避免重复执行?
订单收到支付、发货、取消和重复事件时,怎样让 Elixir 与 Erlang 遵守同一套状态机协议?
Elixir API 与 Erlang worker 之间,怎样固定文字、数据结构和异常协议,使 record 或 Unicode 变化不扩散?
怎样构建有界任务系统,在队列满、worker 崩溃、timeout 与节点断线时守住容量和重试上限,并诚实说明跨重启还缺哪种保证?
每个进程都有一个 mailbox,像驿站收信箱。先发几条消息,再逐条处理。打开“故意不回 reply”,看看消息已经处理、reply 却没有发出时会怎样。
01等待 client 发送消息
这是浏览器中展示消息传递的模型,不是真正的 Erlang VM。它用来观察消息怎样排队和回复。课程页另有可在 IEx / erl 运行的代码。