9 OTP设计原则——第二部分

9.4 gen_statem 行为模式

这一章节结合stdlib man page中的gen_statem(3)阅读,其中详细介绍了gen_statem行为模式的接口函数和回调函数。

注意:这是Erlang/OTP 19.0 开始提供的新行为模式,它已经经过严格的检验和慎重思考,并且稳定的运行在至少两个重量级OTP应用。根据用户反馈,可能会在Erlang/OTP 20.0中做一些不向下兼容的改动,我们希望不会如此。

9.4.1 事件驱动的状态机

现有公认的有效状态机理论并没有涉及状态转移如何触发,我们假设输出是由输入和状态函数运算,并产生一些值。

对于事件驱动的状态机,输入是一个触发状态转移的事件,输出是状态转移过程中执行的动作。有限状态机的数学模型和下面的关系集合类似:

State(S) x Event(E) -> Actions(A), State(S')

这组关系可以这样理解:

9 OTP设计原则——第一部分

9.1 概述

OTP设计原则用于指导以进程、模块和目录的形式组织Erlang代码的规范。

9.1.1 Supervision树——进程管理树(监控树)

Erlang/OTP最基本的概念是监控树,由workers进程和supervisors进程组成。workers是真正执行任务的进程,我们在这里实现自己的功能;supervisors是监控进程,用于监视worker进程的行为,当worker进程异常时可以重启它。通过这种设计,worker进程可以专注工作,而supervisor监控进程尽量少的做事——它只负责监视自己负责的进程,可能是worker进程,也可能是次级监控进程。监控树按照层级组织代码,由顶层监控进程、次级监控进程和工作进程组成,很容易设计高容错系统。

9.1.2 行为模式(behaviours)

在监控树中,许多进程有类似的结构和模式。例如,supervisors进程结构上类似,区别就是监控的子进程不一样。workers进程几乎都是客户端-服务端架构、有限状态机模型,以及拥有类似的事件处理机制,比如异常日志。