Elixir
Concurrent, fault-tolerant systems on the BEAM.
A: 像 Clojure 的 keyword / Haskell 的 Symbol。:ok、:error、:running、:foo_bar。
Vultr 的"一台虚拟机"。类比 AWS EC2 Instance / DigitalOcean Droplet / Hetzner Cloud Server。
如果你赶时间(目标:3 天能改 ex/elixir 的代码):
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
Elixir 相比 JVM/Node 在"按需起 VM"场景有 3 个独有优势:
一节课覆盖所有语法点——基于你已知的 Haskell/Clojure/Scala 经验做对照。
BEAM 进程 + GenServer + Supervisor——Elixir 区别于其他 FP 语言的独门。
协议 / 行为 / 宏 / 热代码——这些是 Elixir 区别于其他 FP 语言的独门武器,读完能看懂任何 Oban/Ecto 库的源码。
一节课把 Elixir 跟 5 个主流语言的核心差异过一遍,速查表为主。
8 道读代码 + 2 道改代码 + 5 道综合题。检验你 0001-0004 是否掌握。
Elixir 的官方构建工具,对比你熟知的 Clojure Leiningen 和 Java Maven。
不是 CF 全家桶介绍,是 对 agquant.com 真正有用 的 8 个功能。
不是 Vultr 介绍,是 对 agquant.com / ex/elixir 项目真正有用 的 8 个能力。
不是 SEO 入门,是 让 agquant.com/learning/ 在 Google / Bing / 百度 上排名 的 10 个实战步骤。
给 agquant.com/learning/ 的实战方案:不写后端、不被脚本注册、便宜到不肉疼、不用微信年费。
把一次 HTTP 请求,变成可靠、可重试、可观测的后台工作。
Ecto 的 schema 不仅是字段映射:prefix 决定表落在哪个 PostgreSQL schema,复合主键需要显式声明,changeset 才是真正的"写入网关"。
Ecto.Query 几乎能覆盖所有标准 SQL:join、聚合、窗口、CTE、FILTER、LEFT JOIN。raw SQL 应该留给"DSL 真的写不出来"的场景。
Plug 既是 Web 服务器抽象,也是中间件协议。Plug.Router 用宏定义路由,背后是一个 match-dispatch 流水线;Parsers 把请求体变成你能用的 map;CORS 是一个普通 Plug。
OTP 监督树不是"启动一些进程"那么简单:它规定了"哪些进程必须活"、"哪些可以暂时缺"、"哪些只在测试环境出现"。
Finch 是 Elixir 生态里基于 Mint / :httpc 的 HTTP 客户端。它走 BEAM 进程模型,能复用连接、能做 SSE、能精确控制超时和错误语义。
Elixir 是动态类型语言,但并不意味着没有"接口"。Behaviour、Protocol 和 Macro 是三种把多态写在结构里、让代码自我描述的工具。
GenServer 是 OTP 的核心并发原语;ETS 是 BEAM 自带的内存表;把代码文件和它们结合起来,你就能做出"运行时改业务规则"的系统。
Redis 的 LIST 是最简单的队列,但生产环境必须解决三个问题:连接池、上游背压、运行时监控。Redix 是 Elixir 生态首选的 Redis 客户端。
Oban 不只是"入队-出队"。它在数据库里维护 Job 状态机,提供 cron 调度、唯一约束、retry 策略、discarded 告警。掌握这些钩子,才能让后台任务真正可靠。
Elixir 的测试生态不只是 ExUnit。Ecto Sandbox 让测试可以并行跑、互不干扰;Mox 让你在测试里替换 Behaviour 实现;Phoenix / Plug 测试让 HTTP 集成变得自然。
不要只把 REPL 当计算器:用 IEx 读代码、查进程、调试监督树和验证数据库查询。
本教程几乎所有 Elixir 代码例子都来自 ex/elixir/ 下的实际项目: