《分布式实时处理系统:原理、架构与实现》全书分为3篇:第一篇详细讲解本书将要开发的分布式实时计算系统所涉及的相关技术,特别针对C++11的新特性着重介绍。第二篇剖析分布式计算系统编程细节,其中对每个重要的概念、模型和函数都加以阐述。第三篇主要关注实战用例,将编写数个极具实践价值的应用程序,为开发者提供参考。通过阅读本书,读者不仅能开发出一套基于C/C++实现的分布式实时计算系统,而且还可以以此学习和了解服务器编程接口设计以及UNIX服务器开发的多个重要主题,对未来实际应用与开发提供参考。
目录
- 目录
- 本书赞誉
- 序一
- 序二
- 序三
- 前言
- 第1章 分布式计算概述 1
- 1.1 分布式概念 1
- 1.2 分布式计算及其原理 2
- 1.3 分布式系统特性 3
- 1.3.1 容错性 3
- 1.3.2 高可扩展性 4
- 1.3.3 开放性 5
- 1.3.4 并发处理能力 5
- 1.3.5 透明性 6
- 1.4 通用分布式计算系统 6
- 1.4.1 Apache Hadoop 6
- 1.4.2 Apache Spark 8
- 1.4.3 Apache Storm 9
- 1.5 分布式存储系统 10
- 1.5.1 分布式存储概念 10
- 1.5.2 分布式存储系统特点 12
- 1.5.3 分布式存储系统分类 12
- 1.5.4 常见分布式存储系统 13
- 1.6 本章小结 14
- 第2章 分布式系统通信基础 15
- 2.1 时代的浪潮 15
- 2.1.1 集中式通信网 16
- 2.1.2 去中心化 16
- 2.2 可靠的数据链路 17
- 2.2.1 数据分组 17
- 2.2.2 帧同步 18
- 2.2.3 差错控制 18
- 2.2.4 链路管理 18
- 2.2.5 问题与解决方案 19
- 2.3 分层架构 19
- 2.4 网络层 22
- 2.4.1 寻找路径 22
- 2.4.2 网络分层 23
- 2.4.3 TCP/IP概述 23
- 2.4.4 IP协议 24
- 2.5 传输层 30
- 2.5.1 数据自动分包 30
- 2.5.2 端到端的传输 30
- 2.5.3 数据的可靠传输 30
- 2.6 应用层 35
- 2.6.1 ping 35
- 2.6.2 telnet 36
- 2.6.3 OSPF 36
- 2.6.4 DNS 36
- 2.6.5 HTTP协议 37
- 2.7 基于消息协议的公告牌 38
- 2.7.1 需求描述 38
- 2.7.2 制定协议 38
- 2.8 分布式通信举例——MapReduce 39
- 2.9 本章小结 41
- 第3章 通信系统高层抽象 42
- 3.1 RPC介绍 42
- 3.2 RESTful 44
- 3.2.1 资源和表现层 45
- 3.2.2 状态转移 45
- 3.2.3 RESTful总结 46
- 3.3 消息队列 46
- 3.4 序列化 49
- 3.5 使用Thrift实现公告牌服务 50
- 3.5.1 Apache Thrift介绍 51
- 3.5.2 安装Apache Thrift 51
- 3.5.3 编写Thrift文件 52
- 3.5.4 实现服务器 53
- 3.5.5 实现客户端 54
- 3.6 本章小结 56
- 第4章 走进C++高性能编程 57
- 4.1 基于C++的留言板系统 58
- 4.1.1 基于Socket的通信 58
- 4.1.2 C++中的内存与资源管理 64
- 4.2 来自服务器的天书 69
- 4.2.1 编码 69
- 4.2.2 C++98的编码缺陷 72
- 4.2.3 C++11编码支持 73
- 4.3 繁忙的服务器 75
- 4.3.1 分身乏术 75
- 4.3.2 fork——分身术 76
- 4.3.3 进程间通信 79
- 4.3.4 轻量级分身——线程 85
- 4.3.5 C++11线程 86
- 4.3.6 竞争问题与解决方案 88
- 4.3.7 多线程优化 95
- 4.3.8 异步I/O 99
- 4.4 消失不见的内存 105
- 4.4.1 内存分配与内存碎片 106
- 4.4.2 tcmalloc 108
- 4.4.3 内存池 110
- 4.5 本章小结 112
- 第5章 分布式实时处理系统 113
- 5.1 Hadoop与MapReduce 113
- 5.1.1 HDFS 114
- 5.1.2 MapReduce模型 115
- 5.2 Storm实时处理系统 129
- 5.2.1 历史 129
- 5.2.2 计算模型 130
- 5.2.3 总体架构 133
- 5.2.4 Storm元数据 133
- 5.2.5 Storm与Hadoop比较 138
- 5.3 有保证的消息处理 139
- 5.3.1 完全处理与元组树 139
- 5.3.2 元组的唯一标识 139
- 5.3.3 确认和失败 141
- 5.3.4 高效实现 143
- 5.4 本章小结 144
- 第6章 实时处理系统编程接口设计 145
- 6.1 总体架构设计 145
- 6.1.1 Hurricane与Storm比较 145
- 6.1.2 总体架构 146
- 6.1.3 任务接口 148
- 6.2 消息源接口设计 149
- 6.3 消息处理器接口设计 150
- 6.4 数据收集器设计 151
- 6.5 元组接口设计 154
- 6.6 序列化接口设计 160
- 6.7 本章小结 161
- 第7章 服务组件设计与实现 162
- 7.1 Executor设计与实现 162
- 7.1.1 事件驱动的消息队列 162
- 7.1.2 动态装载技术 167
- 7.1.3 Executor实现 169
- 7.2 Task设计与实现 171
- 7.3 本章小结 172
- 第8章 管理服务设计与实现 173
- 8.1 President功能与设计 173
- 8.2 President实现 174
- 8.2.1 简单的网络通信实现 175
- 8.2.2 Topology装载实现 182
- 8.2.3 Manager管理调度实现 184
- 8.2.4 序列化实现 193
- 8.3 本章小结 198
- 第9章 实时处理系统编程接口实现 199
- 9.1 消息源接口实现 200
- 9.1.1 消息源执行器 200
- 9.1.2 WordCount实现实例 205
- 9.2 消息处理单元接口实现 207
- 9.2.1 消息处理单元执行器 207
- 9.2.2 事件处理 212
- 9.2.3 WordCount实现实例 215
- 9.3 数据收集器实现 218
- 9.3.1 分发策略 218
- 9.3.2 传输层实现 224
- 9.4 本章小结 226
- 第10章 可靠消息处理 227
- 10.1 基本概念 227
- 10.1.1 完全处理 227
- 10.1.2 失败与重发 229
- 10.2 接口设计 229
- 10.3 具体实现 233
- 10.3.1 简单实现 233
- 10.3.2 高效实现 235
- 10.4 本章小结 237
- 第11章 通信系统设计与实现 238
- 11.1 I/O多路复用方案解析 239
- 11.1.1 基本网络编程接口 239
- 11.1.2 非阻塞的服务器程序 241
- 11.1.3 使用select()接口的基于事件驱动的服务器模型 242
- 11.1.4 使用epoll实现异步事件通知模型 245
- 11.2 基础工具 249
- 11.2.1 线程工具 250
- 11.2.2 日志工具 254
- 11.3 传输层实现 263
- 11.3.1 Reactor模式 263
- 11.3.2 定义抽象TP传输层 264
- 11.3.3 实现基于epoll的TP传输层 269
- 11.3.4 实现基于IOCP的TP传输层 290
- 11.4 应用层HTTP实现 307
- 11.4.1 HttpContext 307
- 11.4.2 HttpRequest 311
- 11.4.3 HttpResponse 313
- 11.4.4 HttpConnection 315
- 11.4.5 HttpServer 317
- 11.4.6 总结 319
- 11.5 跨平台分割编译 320
- 11.5.1 Makefile 320
- 11.5.2 Kake 323
- 11.6 与实时处理系统集成 325
- 11.6.1 修改NetListener 325
- 11.6.2 修改NetConnector 327
- 11.7 本章小结 330
- 第12章 事务性Topology实现 331
- 12.1 Exact-once语义解决方案 331
- 12.2 设计细节 333
- 12.2.1 构造事务性Topology 333
- 12.2.2 消息处理单元 334
- 12.3 事务性Topology API 337
- 12.3.1 消息处理单元 337
- 12.3.2 事务性消息源 339
- 12.4 本章小结 339
- 第13章 多语言接口 340
- 13.1 C语言通用接口 340
- 13.1.1 元组接口 342
- 13.1.2 消息源接口 346
- 13.1.3 消息处理单元接口 349
- 13.1.4 计算拓扑接口 352
- 13.2 Python接口 354
- 13.2.1 ctypes 354
- 13.2.2 元组接口 356
- 13.2.3 消息源接口 359
- 13.2.4 消息处理单元接口 360
- 13.2.5 计算拓扑接口 361
- 13.2.6 应用示例 364
- 13.3 JavaScript接口 365
- 13.3.1 V8引擎 366
- 13.3.2 Node.js 366
- 13.3.3 V8的互操作接口 367
- 13.3.4 任务接口 368
- 13.3.5 消息源接口 369
- 13.3.6 消息处理单元接口 370
- 13.3.7 计算拓扑接口 371
- 13.3.8 应用示例 373
- 13.4 Java接口 375
- 13.4.1 任务接口 375
- 13.4.2 消息源接口 376
- 13.4.3 消息处理单元接口 377
- 13.4.4 计算拓扑接口 377
- 13.4.5 本地代码 380
- 13.4.6 应用示例 382
- 13.5 Swift接口 384
- 13.5.1 应用范围 385
- 13.5.2 任务接口 385
- 13.5.3 消息源接口 386
- 13.5.4 消息处理单元接口 387
- 13.5.5 计算拓扑接口 388
- 13.6 本章小结 390
- 第14章 Squared设计与实现——实现高级抽象元语 391
- 14.1 Storm Trident介绍 391
- 14.1.1 Squared示例 391
- 14.1.2 DRPC示例 394
- 14.2 Squared实现 396
- 14.2.1 SquaredTopology和Spout 396
- 14.2.2 SquaredBolt 401
- 14.2.3 Stream 405
- 14.2.4 状态存储 410
- 14.2.5 DRPC实现 412
- 14.2.6 操作与处理节点 416
- 14.2.7 流操作 419
- 14.3 本章小结 423
- 第15章 实战:日志流处理 425
- 15.1 日志流处理设计方案 425
- 15.2 实现Topology 427
- 15.2.1 编写消息源 427
- 15.2.2 编写索引消息处理单元 428
- 15.2.3 编写统计消息处理单元 429
- 15.3 本章小结 431
- 第16章 实战:频繁组合查找 432
- 16.1 背景介绍 432
- 16.1.1 数据挖掘概念 432
- 16.1.2 关联规则和频繁项集 433
- 16.1.3 啤酒与尿布 435
- 16.2 频繁二项集挖掘方法 435
- 16.2.1 频繁二项集 435
- 16.2.2 算法设计思路 438
- 16.2.3 Hurricane实现思路 439
- 16.3 编写Spout 439
- 16.4 编写Bolt 441
- 16.4.1 SplitBolt 441
- 16.4.2 PairCountBolt 442
- 16.4.3 PairTotalCountBolt 443
- 16.4.4 ConfidenceComputeBolt 444
- 16.4.5 SupportComputeBolt 445
- 16.4.6 FilterBolt 447
- 16.5 编写Topology 448
- 16.6 本章小结 449
- 第17章 实战:在AWS和阿里云上部署Hurricane实时处理系统 450
- 17.1 AWS部署 450
- 17.1.1 搭建虚拟私有云 452
- 17.1.2 配置安全组 455
- 17.1.3 加载EC2实例 456
- 17.1.4 弹性IP地址管理 461
- 17.2 阿里云部署 464
- 17.2.1 创建虚拟私有云 464
- 17.2.2 管理安全组 467
- 17.2.3 创建ECS 468
- 17.2.4 SSH登录 471
- 17.3 Hurricane分布式部署与管理 471
- 17.3.1 分布式部署原理 472
- 17.3.2 分布式安装配置 472
- 17.3.3 分布式启动 476
- 17.4 部署分布式实时处理系统 477
- 17.5 未来之路 478
- 17.6 本章小结 479