Erlang 不是关于轻量级进程和消息传递的……

这是一篇关于 Erlang 中行为(Behaviours)的详细介绍文章,主要内容如下:

  • 背景(Background):Erlang 有有趣的历史,始于 Prolog 库,后成为独立语言,目标是构建可靠的分布式系统,80、90 年代用于 Ericsson 电话交换机,1998 年被禁止后开源,Joe Armstrong 是主要设计者之一,他的博士论文阐述了 Erlang 的重要理念是行为,而非轻量级进程和消息传递。
  • 行为(Behaviours)

    • 通用服务器行为(Generic server behaviour):类似 Java 或 Go 中的接口,是一组类型签名,可有多个实现,如 Go 中的HasName接口和Greet函数,Erlang 中的gen_server行为用于实现键值存储服务器,handle_call处理请求并更新状态,所有并发被隐藏在gen_server中。
    • 事件管理器行为(Event manager behaviour):用于注册事件处理程序,如简单的日志记录器,handle_event用于记录错误消息,trim用于处理消息队列,report用于显示最后五个错误消息。
    • 状态机行为(State machine behaviour):已重命名为gen_statem,更适合实现协议,与gen_server类似但更侧重于状态机。
    • 监督者行为(Supervisor behaviour):负责确保其他进程健康,有多种重启策略,如one_for_oneone_for_all,监督者可以监督其他监督者,其理念来自“让它崩溃”哲学,能产生可靠的系统,如 Ericsson AXD301 电话交换机。
    • 应用和发布行为(Application and release behaviours)applicationrelease虽不一定是严格的行为,但提供了清晰的结构,application包含监督树和其他应用所需的东西,release打包一个或多个应用并处理升级。
  • 如何实现行为(How behaviours can be implemented):通过将gen_server的顺序签名转换为可处理并发请求的方式,如启动 HTTP 服务器处理请求队列,gen_event可通过注册回调实现,supervisor的实现更复杂,需处理跨计算机的情况。
  • 行为的正确性(Correctness of behaviours):通过模拟测试可以利用gen_server的结构解决分布式领导选举等难题,模拟测试能在极端条件下测试系统,如不可靠的网络或电源故障,同时形式验证也更简单,如 Lamport 的模型检查工作和 Kleppmann 的证明。
  • 贡献(Contributing):作者正在开展一些相关工作,如借鉴 Martin Thompson 的工作实现快速事件循环,丰富状态机类型,实现更详细的监督者以及热代码交换等,欢迎感兴趣的人参与。
  • 参考资料(See also):列举了与 Erlang 行为相关的各种资料,包括 Joe Armstrong 的论文、OTP 设计原则、各种行为的文档、相关讲座等。
  • 讨论(Discussion):提供了在 Hacker News、lobste.rs、r/programming、r/haskell、r/erlang 和 Elixir Forum 等平台的讨论链接。

总体而言,文章强调了 Erlang 中行为的重要性及其在构建可靠系统中的作用,同时探讨了如何在其他语言中实现类似的结构。

阅读 36
0 条评论