反应式设计模式

反应式设计模式"

作者:[美]罗兰·库恩(RolandKuhn)布赖恩·哈纳菲(BrianHanafee)杰米·艾伦(JamieAllen)著何品邱嘉和王石冲译林炜翔审校
ISBN:9787302517146
定价:¥98
字数:千字
页数:
出版时间:2019.01.01
开本:
版次:1-3
装帧:
出版社:清华大学出版社
简介

《反应式设计模式》介绍反应式应用程序设计的原则、模式和经典实践,讲述如何用断路器模式将运行缓慢的组件与其他组件隔开、如何用事务序列(Saga)模式实现多阶段事务以及如何通过分片模式来划分数据集,分析如何保持源代码的可读性以及系统的可测试性(即使在存在许多潜在交互和失败点的情况下)。

主要内容

? “反应式宣言”权威指南

?  流量控制、有界一致性、容错等模式

?  得之不易的关于“什么行不通”的经验

?  在巨大的负载下保持伸缩性的架构

前言

前    言

《反应式设计模式》旨在成为引导你理解和设计反应式系统的综合性指南,不仅提供《反应式宣言》的注解版本,还包括开创该宣言的缘由和论据。《反应式设计模式》浓墨重彩地描述一些反应式设计模式,这些模式实现反应式系统设计的多个方面;还列出了更深层次的文献资源,以便你进一步研究。所陈述的模式形成一个连贯整体,虽然并非详尽无遗,但其所包含的背景知识将使得读者能在需要的时候识别、提炼和呈现出新模式。

读者对象

《反应式设计模式》面向每一位想要实现反应式系统的人士。

? 《反应式设计模式》涵盖反应式系统的架构设计以及设计理念,向架构师简要介绍反应式应用程序及其组件的特性,并讨论了这些模式的适用性。 

? 践行者将受益于书中对于每个模式所适用场景的详尽讨论。《反应式设计模式》列出各模式的应用步骤,并配备完整的源代码;讲述了在不同场景下,如何灵活运用和适配这些模式。

? 希望学到更多知识的读者在观看了Principles of Reactive Programming视频课程后,将乐意了解反应式原则背后的思考过程,并可遵循参考文献做进一步的研究。

阅读《反应式设计模式》前,读者不必预先了解反应式系统,但仍然需要熟悉通常的软件开发,并具有一些排除分布式系统引发的困难的经验。对于某些部分,基本理解函数式编程将有所裨益(例如了解如何使用不可变值和纯函数进行编程),但不必了解范畴论。

导读

《反应式设计模式》的内容是特意组织编排的,以便读者可像读一本故事书那样翻阅。首先呈现一个介绍性示例,概述《反应式宣言》以及反应式工具集,进而探讨反应式原则背后的哲学,最后从不同角度阐述设计反应式系统所需的设计模式。这段旅程涵盖大量知识领域,并在文字描述中引用了不少额外的背景资料。通读一遍,浏览相关内容,你将建立对书中知识范围的直觉。但这通常只是进一步研究的起点;在自己的项目中应用从《反应式设计模式》学到的知识时,可回头再次研读,那时会获得更深刻的洞察力。

如果你已经熟悉反应式系统面临的挑战,可跳过第1章;如果你已经熟悉大多数行业主流工具,则可跳过第3章。时间紧迫的读者可直接开始阅读第III部分讲述的各个模式,但依然建议首先学习第II部分:模式的描述过程常引用相关解释及理论背景,这些内容都是对应设计模式的衍生基础。

具有更多设计和实现反应式系统的经验后,预计你将再次研读那些更富哲理性的章节——尤其是第8章和第9章;首次阅读时,会觉得这两章的内容难以理解,请不必担心,反复研读即可。

约定

由于在作为编程概念时,对英文单词future的多重解读已严重偏离其本身的含义,因此,所有将其作为编程概念引用的地方都使用首字母大写的Future,就算没有出现在代码字体中也是如此。

英文单词Actor的情况略有不同,在日常英语中Actor指舞台上的一个人,以及一个动作或处理过程的参与者。因此,这个单词只有在特别指 Actor 模型,或在代码字体中作为 Actor 特质出现时,才会大写。

源代码下载

《反应式设计模式》的示例源代码(作者提供的源代码)可从GitHub下载:https://github. com/ReactiveDesignPatterns/CodeSamples/。

《反应式设计模式》译者对源代码进行了重新调试,新代码下载位置如下:https://github.com/ ReactivePlatform/Reactive-Design-Patterns。

《反应式设计模式》正文列出的代码都是经过译者重新调试过的代码。

读者也可扫描封底的二维码,下载这两套代码。

中文版还提供在线资源:https://rdp.reactiveplatform.xyz/。

GitHub还提供其他功能,允许你讨论《反应式设计模式》中的示例或报告问题,并欢迎你提出改进意见,这样,其他读者将受益于你的思考和经验。

书中大部分示例代码都用 Java 或 Scala 编写,并将SBT用作构建工具。要查阅SBT详细文档,请访问 https://www.scala-sbt.org/;要查阅SBT入门资料,可访问https://github.com/ReactivePlatform/Notes/issues/8。为构建和运行示例代码,还需要使用JDK 8。

其他在线资源

可访问https://www.reactivedesignpatterns.com/获取《反应式设计模式》所介绍模式的概述和附加材料。此外,读者可免费访问Manning出版社的私有Web论坛,在那里,可评论《反应式设计模式》、提出技术问题,还可获得作者和其他用户的帮助。可用Web浏览器访问https://www.manning.com/books/reactive-design-patterns。可从这个页面了解以下信息:注册后如何访问该论坛、可获得哪些帮助以及该论坛的一些行为准则。

Manning承诺为读者提供一个交流场所,在那里,你可与作者以及其他读者进行有意义的对话。但作者不对参与程度做任何承诺,作者对AO的贡献仍是自愿的和无偿的。我们建议你向作者提一些富有挑战性的问题,以引起他们的兴趣!

只要《反应式设计模式》英文版尚未绝版,就可从Manning出版社的网站上访问到作者在线论坛以及之前讨论的存档。

目录

目  录

第Ⅰ部分  简介

第1章  为什么需要反应式?   3

1.1  剖析反应式应用   5

1.2  应对负载   6

1.3  应对失败   7

1.4  让系统即时响应   9

1.5  避免大泥球   10

1.6  整合非反应式组件   11

1.7  小结   12

第2章  《反应式宣言》概览   13

2.1  对用户作出反应   13

2.1.1  理解传统方法   14

2.1.2  使用共享资源的延迟分析   16

2.1.3  使用队列限制最大延迟   17

2.2  利用并行性   18

2.2.1  通过并行化降低延迟   19

2.2.2  使用可组合的Future改善并行性   21

2.2.3  为序列式执行表象买单   22

2.3  并行执行的限制   24

2.3.1  阿姆达尔定律   24

2.3.2  通用伸缩性法则   25

2.4  对失败作出反应   26

2.4.1  划分与隔离   28

2.4.2  使用断路器   29

2.4.3  监督   30

2.5  放弃强一致性   32

2.5.1  ACID 2.0   33

2.5.2  接受更新   34

2.6  对反应式设计模式的需求   35

2.6.1  管理复杂性   36

2.6.2  使编程模型更贴近真实世界   37

2.7  小结   38

第3章  行业工具   39

3.1  反应式的早期解决方案   39

3.2  函数式编程   41

3.2.1  不可变性   42

3.2.2  引用透明性   44

3.2.3  副作用   45

3.2.4  函数作为一等公民   46

3.3  即时响应用户   47

3.4  对反应式设计的现有支持   49

3.4.1  绿色线程   49

3.4.2  事件循环   50

3.4.3  通信顺序进程   51

3.4.4  Future和Promise   53

3.4.5  反应式扩展工具包   58

3.4.6  Actor模型   59

3.5  小结   64

第Ⅱ部分  微言大义

第4章  消息传递   67

4.1  消息   67

4.2  垂直伸缩   68

4.3 “基于事件”与“基于消息”   69

4.4  “同步”与“异步”   71

4.5  流量控制   73

4.6  送达保证   75

4.7  作为消息的事件   77

4.8  同步消息传递   79

4.9  小结   79

第5章  位置透明性   81

5.1  什么是位置透明性?   81

5.2  透明化远程处理的谬误   82

5.3  基于显式消息传递的纠正方案   83

5.4  优化本地消息传递   84

5.5  消息丢失   85

5.6  水平扩展性   87

5.7  位置透明性使测试更加简单   88

5.8  动态组合   88

5.9  小结   90

第6章  分而治之   91

6.1  分层拆解问题   92

6.2 “依赖”与“子模块”   94

6.3  构建你自己的大公司   96

6.4  规范和测试的优点   97

6.5  水平扩展性和垂直伸缩性   98

6.6  小结   99

第7章  原则性失败处理   101

7.1  所有权意味着承诺   101

7.2  所有权隐含生命周期控制   103

7.3  所有级别上的回弹性   104

7.4  小结   105

第8章  有界一致性   107

8.1  封装模块纠正方案   108

8.2  根据事务边界对数据和行为进行分组   109

8.3  跨事务边界建模工作流   109

8.4  失败单元即一致性单元   110

8.5  分离职责   111

8.6  坚持一致性的隔离范围   113

8.7  小结   114

第9章  按需使用非确定性   115

9.1  逻辑编程和声明式数据流   115

9.2  函数式反应式编程   117

9.3  不共享简化并发   118

9.4  共享状态的并发   119

9.5  如何窘境突围?   119

9.6  小结   121

第10章  消息流   123

10.1  推动数据向前流动   123

10.2  模型化领域流程   125

10.3  认清回弹性的局限性   125

10.4  估计速率和部署规模   126

10.5  为流量控制进行规划   127

10.6  小结   127

第Ⅲ部分  设计模式

第11章  测试反应式应用程序   131

11.1  如何测试   131

11.1.1  单元测试   132

11.1.2  组件测试   133

11.1.3  联动测试   133

11.1.4  集成测试   133

11.1.5  用户验收测试   134

11.1.6  黑盒测试与白盒测试   134

11.2  测试环境   135

11.3  异步测试   136

11.3.1  提供阻塞的消息接收者   137

11.3.2  选择超时时间的难题   139

11.3.3  断言消息的缺失   145

11.3.4  提供同步执行引擎   146

11.3.5  异步断言   148

11.3.6  完全异步的测试   149

11.3.7  断言没有发生异步错误   151

11.4  测试非确定性系统   154

11.4.1  执行计划的麻烦   155

11.4.2  测试分布式组件   155

11.4.3  模拟Actor   156

11.4.4  分布式组件   157

11.5  测试弹性   157

11.6  测试回弹性   158

11.6.1  应用程序回弹性   158

11.6.2  基础设施的回弹性   162

11.7  测试即时响应性   164

11.8  小结   165

第12章  容错及恢复模式   167

12.1  简单组件模式   167

12.1.1  问题设定   168

12.1.2  模式应用   168

12.1.3  模式回顾   170

12.1.4  适用性   171

12.2  错误内核模式   171

12.2.1  问题设定   172

12.2.2  模式应用   172

12.2.3  模式回顾   175

12.2.4  适用性   176

12.3  放任崩溃模式   176

12.3.1  问题设定   177

12.3.2  模式应用   177

12.3.3  模式回顾   178

12.3.4  实现上的考虑   179

12.3.5  推论:心跳模式   180

12.3.6  推论:主动失败信号模式   180

12.4  断路器模式   181

12.4.1  问题设定   182

12.4.2  模式应用   182

12.4.3  模式回顾   186

12.4.4  适用性   187

12.5  小结   187

第13章  复制模式   189

13.1  主动-被动复制模式   190

13.1.1  问题设定   190

13.1.2  模式应用   191

13.1.3  模式回顾   203

13.1.4  适用性   204

13.2  多主复制模式   204

13.2.1  基于共识的复制   205

13.2.2  具有冲突检测与处理方案的复制方式   208

13.2.3  无冲突的可复制数据类型   210

13.3  主动-主动复制模式   217

13.3.1  问题设定   218

13.3.2  模式应用   218

13.3.3  模式回顾   225

13.3.4  与虚拟同步模型的关系   226

13.4  小结   227

第14章  资源管理模式   229

14.1  资源封装模式   229

14.1.1  问题设定   230

14.1.2  模式应用   230

14.1.3  模式回顾   236

14.1.4  适用性   237

14.2  资源借贷模式   237

14.2.1  问题设定   238

14.2.2  模式应用   238

14.2.3  模式回顾   240

14.2.4  适用性   241

14.2.5  实现上的考虑   242

14.2.6  变体:使用资源借贷模式进行局部公开   242

14.3  复杂命令模式   243

14.3.1  问题设定   243

14.3.2  模式应用   244

14.3.3  模式回顾   251

14.3.4  适用性   252

14.4  资源池模式   252

14.4.1  问题设定   253

14.4.2  模式应用   253

14.4.3  模式回顾   255

14.4.4  实现上的考虑   256

14.5  托管阻塞模式   257

14.5.1  问题设定   257

14.5.2  模式应用   258

14.5.3  模式回顾   260

14.5.4  适用性   261

14.6  小结   262

第15章  消息流模式   263

15.1  请求-响应模式   264

15.1.1  问题设定   264

15.1.2  模式应用   265

15.1.3  该模式的常见实例   267

15.1.4  模式回顾   272

15.1.5  适用性   272

15.2  消息自包含模式   273

15.2.1  问题设定   273

15.2.2  模式应用   274

15.2.3  模式回顾   276

15.2.4  适用性   277

15.3  询问模式   277

15.3.1  问题设定   278

15.3.2  模式应用   278

15.3.3  模式回顾   281

15.3.4  适用性   283

15.4  转发流模式   283

15.4.1  问题设定   283

15.4.2  模式应用   284

15.4.3  模式回顾   284

15.4.4  适用性   285

15.5  聚合器模式   285

15.5.1  问题设定   285

15.5.2  模式应用   286

15.5.3  模式回顾   289

15.5.4  适用性   290

15.6  事务序列模式   290

15.6.1  问题设定   291

15.6.2  模式应用   291

15.6.3  模式回顾   293

15.6.4  适用性   294

15.7  业务握手协议(或可靠投递模式)   294

15.7.1  问题设定   295

15.7.2  模式应用   295

15.7.3  模式回顾   300

15.7.4  适用性   301

15.8  小结   301

第16章  流量控制模式   303

16.1  拉取模式   303

16.1.1  问题设定   304

16.1.2  模式应用   304

16.1.3  模式回顾   306

16.1.4  适用性   307

16.2  托管队列模式   307

16.2.1  问题设定   308

16.2.2  模式应用   308

16.2.3  模式回顾   310

16.2.4  适用性   310

16.3  丢弃模式   311

16.3.1  问题设定   311

16.3.2  模式应用   311

16.3.3  模式回顾   313

16.3.4  适用性   316

16.4  限流模式   316

16.4.1  问题设定   316

16.4.2  模式应用   317

16.4.3  模式回顾   320

16.5  小结   320

第17章  状态管理和持久化模式   321

17.1  领域对象模式   321

17.1.1  问题设定   322

17.1.2  模式应用   322

17.1.3  模式回顾   326

17.2  分片模式   326

17.2.1  问题设定   326

17.2.2  模式应用   327

17.2.3  模式回顾   329

17.2.4  重要警告   329

17.3  事件溯源模式   330

17.3.1  问题设定   330

17.3.2  模式应用   330

17.3.3  模式回顾   333

17.3.4  适用性   333

17.4  事件流模式   334

17.4.1  问题设定   334

17.4.2  模式应用   334

17.4.3  模式回顾   336

17.4.4  适用性   337

17.5  小结   337

附录A  反应式系统图示   339

附录B  一个虚构的案例   341

附录C 《反应式宣言》正文   355

作者简介

编辑推荐

现代Web应用程序的用户数量众多,即使服务器出现故障或有新服务器上线,Web应用程序也需要继续提供服务;Web应用程序需要在资源有限的情况下,将信息提供给分布于全球的广大用户。“反应式应用程序”能适应部分失败以及负载变化情形,并在变化多端的分布式环境中保持即时响应性;如何做到这一点呢?秘诀就在于“消息驱动的架构”以及各种设计模式。 

《反应式设计模式》围绕反应式宣言展开,讲述什么是反应式、为何需要反应式,以及反应式系统设计与开发中的一些常用模式,无论是软件开发者还是系统架构师,都可从本书中汲取知识养分。书中提出许多真知灼见,勾勒出反应式应用程序、反应式系统以及反应式平台等概念,有场景、有故事、有概念、有实践,令人沉醉其中,流连忘返。

作者寄语

Roland Kuhn博士曾在慕尼黑工业大学学习物理专业,获得了博士学位;在欧洲核子研究中心(瑞士日内瓦)的高能粒子物理实验中,发表了关于核子的胶子自旋结构测量的博士专题论文。该实验需要使用和实现大型计算集群以及快速的数据处理网络,这也为Roland透彻理解分布式计算奠定了基础。此后,Roland博士在德国空间运营中心工作了4年,负责建设军事卫星的控制中心和地面基础设施。再后来,他加入Lightbend(之前叫做Typesafe)公司,在2012年11月到2016年3月期间负责带领Akka团队。在此期间,他与Martin Odersky和Erik Meijer一起在Coursera平台上讲授Principles of Reactive Programming课程,这门课程的学员超过12万人。Roland与Jonas Bonér等人共同撰写了第一版的《反应式宣言》,该宣言于2013年6月发表。目前,Roland是Actyx的首席技术官及联合创始人,Actyx是一家总部位于慕尼黑的公司,致力于使欧洲的各类中小型制造企业享受到现代反应式系统的福泽。 

Brian Hanafee在加利福尼亚大学伯克利分校获得电气工程与计算机科学学士学位,现任富国银行的首席系统架构师,负责设计网上银行和支付系统,并长期引领公司的技术门槛提升。此前,Brian曾在甲骨文公司工作,致力于研究新兴产品、互动电视系统以及文本处理系统。Brian也曾任博思艾伦咨询公司的咨询师,并曾在ADS公司将人工智能技术应用到军事规划系统中。Brian还为第一代弹射安全的头盔综合显示系统编写了软件。

Jamie Allen是星巴克UCP项目的技术总监,致力于以跨运营模式、跨地域的方式,为星巴克公司各地的消费者重新定义数字体验。他是Effective Akka一书的作者,曾与Roland和Jonas一起在Lightbend公司工作4年以上。Jamie自2008年以来一直从事Scala和Actor开发工作,与世界各地的客户合作,帮助他们理解和采用反应式系统设计。

电子资料

www.luweidong.cn

下一个