封面不明觉厉
这本书很薄,只有93页,而且是免费的,有兴趣的朋友可以去看一看。虽然书中没有提到Elixir,但对于学习Elixir也很有帮助。这本书适合对Erlang和OTP有初步了解的人阅读。书中附带练习。
首先讲的是如何阅读代码
阅读别人的代码首先要搞清楚代码的类型。作者将Erlang的代码分成几类:
- 生代码 —— 一般是初学者的练习,不能算完整的项目;
- OTP应用 —— 包含了说明文档,测试,配置文件等等,可以直接使用。
- 库应用 —— 一般有两个模块 appname, appname_something
- 普通应用 —— 一般两个模块 appname,appname_app
- OTP发行包 —— 使用rebar3将项目和它的所有依赖打包在一起后得到的
第二章讲的是如何编写开源的Erlang应用
介绍了一下rebar3,它是用于生成Erlang发行包的工具。
一个OTP发行包往往包含多个OTP应用。
如果初始状态是不可靠的,那么Supervisor的作用就很小了。
比如,如果不能保证重启后连接正常,就需要在初始代码中发送重连消息,避免频繁的崩溃。
所以,初始状态的限制条件越少越好。
三种应用策略:
- permanent:一旦出问题,整个系统崩溃;
- transient:normal问题没事,别的问题崩溃;
- temporary:什么问题都没事,只会报告。
第三章讲的是为过载情况设计
我们可以把一个项目看成是一间浴室,水流代表用户的请求,当水流过大时,就会从浴缸里溢出。那么如何解决呢,通常我们需要找到瓶颈所在,是排水管道太窄了,还是浴缸太小了,或许需要更多的浴室来处理水流。但是,当我们没有能力解决这些瓶颈时,我们就需要聪明一些,让系统能够在过载情况下运作。有两种策略:back-pressure 和 load-shedding。
需要避免错误日志爆炸。限制输入可以保证最基本的服务,但是用户体验会变得很差。也就是back-pressure会变大。记得设置好time out。
丢弃数据的方式
- 随机取出 —— 是最简单且鲁棒性最强的节省空间的方法;
- 队列缓存 —— 队列数据结构;
- 堆栈缓存 —— 低延迟;列表数据结构;缺点是不会按顺序处理请求;
- 时间敏感缓存 —— 会在旧的请求超时之前进行处理;
- 恒定负载 —— 例如ETS。
第四章 连接到远程节点的方式
- JCL模式
- Remsh
- SSH守护
- 命名管道
第五章 运行指标
主要讲如何查看运行时的各种指标。
erlang:memory().
length(processes())
length(erlang:ports())
第六章 阅读Crash Dumps
每当Erlang进程崩溃后,我们可以阅读一个名为 erl_crash.dump 的文件来寻找原因。
第七章 内存泄露
这一章讲如何检测和修复内存泄露,内容比较专业,没看懂。:p
第八章 CPU资源调度
介绍了一些查看CPU当前参数的函数。
第九章 跟踪
可以对任何Erlang代码进行跟踪,用pid和模式匹配来锁定目标。
结束
这本书详细地介绍了对Erlang程序进行错误调试的过程,还介绍了调试工具recon。本书适合有项目经验的中高级Erlang程序员。