《Erlang/OTP并发编程实战》偏重于生产环境下的Erlang开发设计,关键解读怎样搭建平稳、版本控制优良、可维护保养的商品级编码,汇集了三位Erlang大師很多年的项目经验。 《Erlang/OTP并发编程实战》关键分成三绝大多数:第一一部分解读Erlang编程及OTP基本;第二一部分解读怎样在实际上开发设计中逐一加上OTP高級特点,进而健全运用,创作者根据围绕这书的主新项目——加快Web浏览的分布式系统缓存文件运用,从入门到精通地表明了实践活动中的各种各样方法;第三一部分探讨如何把编码与其他软件和客户集成化,及其怎样开展特性调优。 《Erlang/OTP并发编程实战》朝向Erlang程序猿,及其对Erlang/OTP很感兴趣的开发者。
目录
- 第一部分 Erlang起步:OTP基础
- 第1章 Erlang/OTP平台 2
- 1.1 基于进程的并发编程 3
- 1.1.1 理解并发 3
- 1.1.2 Erlang的进程模型 4
- 1.1.3 4种进程通信范式 5
- 1.1.4 用Erlang进程编程 8
- 1.2 Erlang的容错架构 10
- 1.2.1 进程链接如何工作 10
- 1.2.2 监督与退出信号捕捉 10
- 1.2.3 进程的分层容错 12
- 1.3 分布式Erlang 13
- 1.4 Erlang运行时系统和虚拟机 13
- 1.4.1 调度器 14
- 1.4.2 I/O与调度 15
- 1.4.3 进程隔离与垃圾回收器 15
- 1.5 函数式编程:Erlang的处世之道 16
- 1.6 小结 16
- 第2章 Erlang语言精要 18
- 2.1 Erlang shell 19
- 2.1.1 启动shell 19
- 2.1.2 输入表达式 20
- 2.1.3 shell函数 21
- 2.1.4 退出shell 21
- 2.1.5 任务控制基础 22
- 2.2 Erlang的数据类型 23
- 2.2.1 数值与算术运算 24
- 2.2.2 二进制串与位串 25
- 2.2.3 原子 26
- 2.2.4 元组 27
- 2.2.5 列表 27
- 2.2.6 字符串 28
- 2.2.7 pid、端口和引用 29
- 2.2.8 将函数视作数据:fun函数 30
- 2.2.9 项式的比较 30
- 2.2.10 解读列表 31
- 2.3 模块和函数 33
- 2.3.1 调用其他模块中的函数(远程调用) 33
- 2.3.2 不同元数的函数 34
- 2.3.3 内置函数和标准库模块 34
- 2.3.4 创建模块 35
- 2.3.5 模块的编译和加载 36
- 2.3.6 独立编译器erlc 37
- 2.3.7 已编译模块与在shell中求值 37
- 2.4 变量与模式匹配 38
- 2.4.1 变量的语法 39
- 2.4.2 单次赋值 39
- 2.4.3 模式匹配:加强版的赋值 41
- 2.4.4 解读模式 42
- 2.5 函数与子句 44
- 2.5.1 带副作用的函数:文本打印 44
- 2.5.2 用模式匹配在多个子句中进行选择 45
- 2.5.3 保护式 46
- 2.5.4 模式、子句和变量作用域 47
- 2.6 Case和if表达式 48
- 2.6.1 Erlang的布尔型if-then-else分支选择 48
- 2.6.2 If表达式 49
- 2.7 fun函数 49
- 2.7.1 作为现有函数别名的fun函数 49
- 2.7.2 匿名fun函数 50
- 2.8 异常与try/catch 52
- 2.8.1 抛出(触发)异常 52
- 2.8.2 运用try...catch 53
- 2.8.3 try...of...catch 53
- 2.8.4 after 54
- 2.8.5 获取栈轨迹 54
- 2.8.6 重抛异常 55
- 2.8.7 传统的catch 55
- 2.9 列表速构 56
- 2.9.1 列表速构记法 56
- 2.9.2 映射、过滤和模式匹配 56
- 2.10 比特位语法与位串速构 57
- 2.10.1 构造位串 57
- 2.10.2 比特位语法中的模式匹配 58
- 2.10.3 位串速构 59
- 2.11 记录语法 59
- 2.11.1 记录声明 60
- 2.11.2 创建记录 60
- 2.11.3 记录的字段以及模式匹配 60
- 2.11.4 更新记录字段 60
- 2.11.5 记录声明应该放在哪儿 61
- 2.12 预处理与文件包含 61
- 2.12.1 宏的定义和使用 61
- 2.12.2 文件包含 62
- 2.12.3 条件编译 63
- 2.13 进程 64
- 2.13.1 操纵进程 64
- 2.13.2 消息接收与选择性接收 65
- 2.13.3 注册进程 66
- 2.13.4 消息投递与信号 67
- 2.13.5 进程字典 67
- 2.14 ETS表 68
- 2.14.1 为何ETS表被设计成这样 68
- 2.14.2 ETS表的基本用法 68
- 2.15 以递归代替循环 69
- 2.15.1 从迭代到递归 69
- 2.15.2 理解尾递归 71
- 2.15.3 累加器参数 72
- 2.15.4 谈谈效率 72
- 2.15.5 编写递归函数的窍门 73
- 2.16 Erlang编程资源 78
- 2.16.1 图书 78
- 2.16.2 在线资料 79
- 2.17 小结 79
- 第3章 开发基于TCP的RPC服务 80
- 3.1 你所创建的是什么 81
- 3.1.1 基础知识提醒 82
- 3.1.2 行为模式基础 82
- 3.2 实现RPC服务器 85
- 3.2.1 行为模式实现模块的典型布局 85
- 3.2.2 模块首部 85
- 3.2.3 API段 88
- 3.2.4 回调函数段 92
- 3.3 运行RPC服务器 98
- 3.4 浅谈测试 99
- 3.5 小结 100
- 第4章 OTP应用与监督机制 101
- 4.1 OTP应用 101
- 4.1.1 OTP应用的组织形式 102
- 4.1.2 为应用添加元数据 103
- 4.1.3 应用行为模式 104
- 4.1.4 应用结构小结 105
- 4.2 用监督者实现容错 105
- 4.2.1 实现监督者 106
- 4.2.2 监督者重启策略 107
- 4.2.3 编写子进程规范 108
- 4.3 启动应用 109
- 4.4 生成EDoc文档 110
- 4.5 小结 110
- 第5章 主要图形化监测工具的使用 112
- 5.1 Appmon 112
- 5.1.1 Appmon GUI 112
- 5.1.2 WebTool版Appmon 115
- 5.2 Pman 116
- 5.3 调试器 118
- 5.4 表查看器TV 121
- 5.5 工具栏 123
- 5.6 小结 123
- 第二部分 构建生产系统
- 第6章 打造一套缓存系统 126
- 6.1 故事背景 126
- 6.2 缓存的设计 127
- 6.3 创建OTP应用的基本骨架 130
- 6.3.1 应用目录结构的布局 130
- 6.3.2 创建应用元数据 130
- 6.3.3 实现应用行为模式 131
- 6.3.4 实现监督者 131
- 6.4 从应用骨架到五脏俱全的缓存 133
- 6.4.1 编写sc_element进程 134
- 6.4.2 实现sc_store模块 138
- 6.4.3 打造应用层API模块 142
- 6.5 小结 144
- 第7章 Erlang/OTP中的日志与事件处理 145
- 7.1 Erlang/OTP中的日志 146
- 7.1.1 日志概述 146
- 7.1.2 Erlang/OTP内置的日志设施 147
- 7.1.3 标准日志函数 147
- 7.1.4 SASL与崩溃报告 149
- 7.2 用gen_event编写自定义事件处理器 153
- 7.2.1 gen_event行为模式简介 153
- 7.2.2 事件处理器示例 154
- 7.2.3 处理错误事件 155
- 7.3 为Simple Cache添加自定义事件流 157
- 7.3.1 事件流API 157
- 7.3.2 将处理器整合进Simple Cache 159
- 7.3.3 订阅自定义事件流 161
- 7.4 小结 162
- 第8章 分布式Erlang/OTP简介 163
- 8.1 Erlang分布式基础 163
- 8.1.1 复制式进程间通信 164
- 8.1.2 位置透明性 165
- 8.2 节点与集群 166
- 8.2.1 节点的启动 166
- 8.2.2 节点的互联 167
- 8.2.3 Erlang节点如何定位其他节点并与之建立通信 169
- 8.2.4 magic cookie安全系统 170
- 8.2.5 互联节点间的消息传递 171
- 8.2.6 使用远程shell 173
- 8.3 资源探测攻略 175
- 8.3.1 术语 175
- 8.3.2 算法 176
- 8.3.3 实现资源探测应用 177
- 8.4 小结 182
- 第9章 用Mnesia为cache增加分布式支持 183
- 9.1 分布式缓存 184
- 9.1.1 选取通信策略 184
- 9.1.2 同步缓存和异步缓存 186
- 9.1.3 分布式表 188
- 9.2 用Mnesia实现分布式数据存储 189
- 9.2.1 建立项目数据库 189
- 9.2.2 初始化数据库 191
- 9.2.3 建表 192
- 9.2.4 向表中录入数据 195
- 9.2.5 执行基本查询 197
- 9.3 基于Mnesia的分布式缓存 199
- 9.3.1 用Mnesia取代ETS 199
- 9.3.2 让缓存识别出其他节点 202
- 9.3.3 用资源探测定位其他缓存实例 205
- 9.3.4 动态复制Mnesia表 206
- 9.4 小结 209
- 第10章 打包、服务和部署 210
- 10.1 从系统的角度看应用 210
- 10.1.1 结构 211
- 10.1.2 元数据 211
- 10.1.3 系统如何管理运行中的应用 212
- 10.2 制作发布镜像 213
- 10.2.1 发布镜像 213
- 10.2.2 准备发布代码 214
- 10.2.3 发布镜像的元数据文件 214
- 10.2.4 脚本与启动文件 216
- 10.2.5 系统配置 217
- 10.2.6 启动目标系统 218
- 10.3 发布镜像打包 219
- 10.3.1 创建发布镜像包 219
- 10.3.2 发布镜像包的内容 220
- 10.3.3 定制发布镜像包 222
- 10.4 安装发布镜像 223
- 10.5 小结 223
- 第三部分 集成与完善
- 第11章 为缓存添加HTTP接口 226
- 11.1 实现TCP服务器 226
- 11.1.1 高效TCP服务器的设计模式 227
- 11.1.2 搭建tcp_interface应用的骨架 228
- 11.1.3 填充TCP服务器的实现逻辑 228
- 11.1.4 简单文本协议 231
- 11.1.5 文本接口实现 232
- 11.2 打造一套全新的Web接口 234
- 11.2.1 HTTP简介 234
- 11.2.2 实现一套通用的Web服务器行为模式 237
- 11.2.3 初识REST 248
- 11.2.4 用gen_web_server实现REST式协议 249
- 11.3 小结 252
- 第12章 用端口和NIF集成外围代码 253
- 12.1 端口和NIF 254
- 12.1.1 普通端口 255
- 12.1.2 链入式端口驱动 256
- 12.1.3 原生函数(NIF) 257
- 12.2 用端口来集成解析器 257
- 12.2.1 Erlang方面的端口 257
- 12.2.2 C方面的端口 260
- 12.2.3 编译运行 271
- 12.3 开发链入式驱动 272
- 12.3.1 初识链入式驱动 273
- 12.3.2 驱动的C语言部分 274
- 12.3.3 编译驱动代码 278
- 12.3.4 驱动的Erlang部分 279
- 12.4 将解析器实现为NIF 280
- 12.4.1 NIF的Erlang部分 280
- 12.4.2 NIF的C代码部分 281
- 12.4.3 编译与运行代码 287
- 12.5 小结 288
- 第13章 用Jinterface实现Erlang和Java间的通信 289
- 13.1 利用Jinterface在Erlang中集成Java 290
- 13.1.1 OtpNode类 290
- 13.1.2 OtpMbox类 291
- 13.1.3 Erlang数据结构的Java映射 291
- 13.1.4 示例:Java中的消息处理 292
- 13.1.5 在Erlang中与Java节点通信 294
- 13.2 安装和配置HBase 296
- 13.2.1 下载和安装 296
- 13.2.2 配置HBase 296
- 13.3 为Simple Cache和HBase牵线搭桥 297
- 13.3.1 Erlang方面:sc_hbase.erl 298
- 13.3.2 HBaseConnector类 299
- 13.3.3 Java中的消息处理 301
- 13.3.4 HBaseTask类 304
- 13.4 在Simple Cache中整合HBase 306
- 13.4.1 查询 306
- 13.4.2 插入 307
- 13.4.3 删除 307
- 13.5 运行集成系统 308
- 13.6 小结 310
- 第14章 优化与性能 311
- 14.1 如何进行性能调优 312
- 14.1.1 设定性能目标 312
- 14.1.2 设定基线 313
- 14.1.3 系统性能分析 313
- 14.1.4 确定需要解决的问题 313
- 14.1.5 测定优化成果 313
- 14.2 Erlang代码性能分析 314
- 14.2.1 用cprof计算调用次数 314
- 14.2.2 用fprof测定执行时间 316
- 14.3 Erlang编程语言的缺陷 320
- 14.3.1 基本数据类型的性能特点 321
- 14.3.2 内置函数和运算符的性能 324
- 14.3.3 函数 325
- 14.3.4 进程 327
- 14.4 小结 329
- 附录A 安装Erlang 330
- 附录B 列表与引用透明性 332