科技>计算机>网络与互联网
Akka应用模式:分布式应用程序设计实践指南

Akka应用模式:分布式应用程序设计实践指南"

作者:虞航仲
ISBN:9787121325298
定价:¥65.0
字数:255千字
页数:184
出版时间:2017-10
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

对于想要学习Akka的Java 和 Scala 开发者们,有很多技术资源可供参考,但是如要想知道如何去应用这些技术就需要不同的思维方式了。为了帮助你正确地使用Akka,这本实用的实践指南提供了若干高级的设计模式,还包括了如何以及何时应用那些模式去解决在大型分布式系统中遇到的实际问题的一些案例。

前言

前言 响应式应用开发是软件开发的新前沿。 随着联网设备的普及,数据量也在增加。以前的单线程批处理数据的旧技术根本无法满足这个新领域所提出的需求。大数据的概念已经兴起,我们需要新的工具和新的技术来应对它。 通常,解决现有问题的灵感并不是来自现有的技术,而是来自过去的经验。许多现今用于处理大数据的新工具实际上是基于旧的actor 的概念而产生的。actor 是构建Akka 的关键概念,但其根源追溯起来应该属于过去。actor 不是一个新概念,相反,它是一个被重新关注的旧概念。 当开始探索Akka、actor、streams 和其他与之相关的技术时,我们将从现实世界的角度来看待它们:如何在一系列项目中安排一组人,同时优化他们的可用时间及技能?这是一个复杂的问题,并不是只用一个下午就可以解决的。但这又是一个有趣的问题,为深度探索提供了很大的空间。这也是大多数软件开发人员在职业生涯中的某个时刻一定会遇到的问题。 在对Akka 进行探索的过程中,我们将回顾这个问题。 在解决问题之前,我们必须先了解可用的工具,还需要了解这些工具为什么存在,以及它们可以解决什么样的问题。我们需要知道Akka 的起源及其在Actor 模型中的根源。我们需要一套指导原则将应用程序拼接在一起,这套原则会在探索域驱动设计(DDD)的过程中被发现。有了这些基础,便可以开始使用Akka 提供的所有工具来构建域了。我们可以探索简单的actor 的使用方法以及它如何与流关联,可以让系统分布在多个节点上,使其具有更好的容错性、可用性及可扩展性。 首先,我们需要知道这一切的根源在哪里。 译者序 我在大学期间开始接触并使用Scala,当时就发现了这门语言的强大。正如其名字所表达的那样,Scala 是一门可扩展的编程语言,融合了函数式编程和面向对象编程的特点,支持并发,让异步编程变得很自然,同时表达能力也特别强。虽然Scala 的学习成本会比较高,尤其和Golang、Python 这类语言相比,但是这门语言还是非常实用的,对提高开发效率很有帮助。而且Scala 的创始人Martin Odersky 说过:“Scala 现在是为聪明人创造的,以后也是为聪明人服务的。” Scala 相信程序员的聪明才智,让程序员自行选择合适的结构,以应对千变万化的任务需求,这一点是Scala 做得很不错的地方。 编写正确的具有容错性和可扩展性的分布式、高并发程序非常困难,主要是因为我们使用了错误的工具和错误的抽象层次,而Akka 的出现改变了这种情况。Akka 是参照Apache 2 许可证(一种公认的开源许可证)发布的开源项目,通过使用Actor 模型来提高抽象的级别,并提供了一个更好的平台来构建可扩展的、有弹性的、响应式的应用程序,详细信息可参阅The Reactive Manifesto。对于容错,Akka 采用“让它崩溃(Let It Crash)”的模式,这种模式可以帮助构建可自我修复和永不停止的软件系统。其中actor还提供了透明的分布式抽象,以及真正的可扩展与高容错应用的基础设施。 毕业后,我在腾讯微信团队的后台架构部从事软件开发工作,作为腾讯的战略级产品,微信平均每天面临亿级的在线用户。面对这种用户规模的挑战,基本每一行代码都需要考虑高并发和分布式的场景,大道至简的思想基本贯彻在整个技术产品线上。例如,大系统小做,让一切可扩展;剥离复杂,让剩下的更简单;在容灾之前面向最坏情况思考,防止雪崩;精细监控,迅速响应等。微信团队内部的很多技术点也和Actor 模型很像,比如微信最核心的消息模型和Actor 的邮件模型就很有渊源。消息被发出后,会先在后台临时存储,为了使接收者能更快接收到消息,系统会推送通知给接收者,最后客户端主动到服务器端拉取消息。当然整个微信架构就是微服务的架构,每一个请求后面可能会涉及几百个服务。如何扩展、如何高容错、如何弹性,这些基本是每天都会遇到的挑战,并且也都是设计和开发系统的时候需要考虑的事情。 后来,我离开腾讯,在猎豹移动的广告系统架构部以及新闻团队从事系统架构开发工作,同样涉及微服务架构,每天都要考虑到这些分布式系统可能遇到的并且需要处理的问题。尤其广告系统涉及金钱,因而需要严格保证其高可用性和一致性。 现在,我在创业公司担任技术负责人,同时负责公司内部多个系统的架构工作,也需要时时刻刻考虑和处理高并发、高容错等分布式问题,同样用到了高并发的分布式微服务架构。 本书原名是Applied Akka Patterns :A Hands-On Guide to Designing Distributed Applications,书中介绍了一些很好的分布式系统的设计原则,而且也介绍了Actor 模型和Akka 工具包,对于使用JVM 体系结构的开发者来说是非常值得一看的,因为通过本书能很快地学习并掌握一个强大的工具,在工作中提高生产效率。对于那些使用非JVM体系结构的开发者来说,通过这本书能了解到一个更强大的工具,也是极有帮助的。同时,本书介绍的很多指导原则对于分布式系统设计有很大的借鉴意义,可以避免让自己陷入困境。这本书是一个起点,帮助我们发现新大陆,但绝不会是我们的终点,开拓这块新大陆还需要自己不断努力。其实Scala 本身就是一门很强大的语言,最近也因为Spark、Kafka 等项目在国内掀起了一波关注热潮。Akka 也很优秀,以至于被 Lightbend 收购,并直接用Akka 的actor 替代了Scala 本身的actor。总之,本书中介绍的内容都是非常值得探索和学习的。 决定翻译这本书,不仅因为我参与和主导了不少分布式的项目,也因为对分布式系统设计和开发的热爱,以及对Scala 语言本身的喜欢。我抱着把Actor 模型以及Akka 传递给中国的工程师并让更多人能接触、了解它们的态度来尝试翻译这本书。虽然它们在国内还不算太火,但是在国外已经非常受欢迎。 这本书虽然只有160 多页,但是翻译过程还是比较辛苦的,很多地方的意思都比较隐晦,用中文直译会很有挑战。所以我平时会留意大家在社区里讨论的内容,参考社区里的资料,在遇到一些和自己项目经验不太一致或者比较不确定的地方,也会尝试去查看Akka的源码来尽量保证自己的理解无误,避免误导读者。 在本书的翻译工作结束之际,我首先要感谢博云科技的CTO 李亚琼老师,他的引荐让我获得了翻译这本书的机会。还要感谢孙国立、曾杰瑜、付冉、刘岸,他们在百忙中帮我审阅了本书翻译稿的大部分章节,并针对涉及的专业概念提出不少修改意见。最后要感谢本书的策划编辑孙奇俏,她为本书的编辑和校对做了大量细致的工作。 翻译过程中虽力求理解作者意图,把握全文,但是难免会发生错误,若广大读者发现错误,我在此深表歉意。欢迎广大读者及时与我和出版社联系,提交勘误,方便后续读者更好地阅读。如果有任何好的想法和建议,也欢迎和我邮件沟通,我的邮箱地址是hangzhong.yu@gmail.com。 虞航仲 2017 年8 月于北京

目录

目录 前言 .......................................................................................... xvii 第1 章 Actor 模型 ........................................................................1 现实是最终一致的 .................................................................................................1 解构Actor 模型 .....................................................................................................3 所有的计算都在一个actor 中执行 .........................................................................4 actor 之间只能通过消息进行通信 .........................................................................5 actor 可以创建子actor ...........................................................................................6 actor 可以改变自己的状态或行为 .........................................................................8 一切都是actor .......................................................................................................9 Actor 模型的使用 .................................................................................................10 定义清晰的边界 ................................................................................................... 11 何时适合使用Actor 模型 ....................................................................................13 结论 .....................................................................................................................13 第2 章 Akka 简介 .......................................................................15 Akka 是什么......................................................................................................... 15 Akka 是开源的 .............................................................................................. 15 Akka 正在蓬勃发展 .......................................................................................16 Akka 是为分布式设计的 ...............................................................................16 Akka 组件 ............................................................................................................17 Akka actor .....................................................................................................17 子actor .......................................................................................................... 18 remoting :不同JVM 上的actor ....................................................................20 clustering :集群成员的自动化管理 ..............................................................20 Akka HTTP ...................................................................................................24 TestKit ........................................................................................................... 25 contrib ........................................................................................................... 25 Akka OSGi ................................................................................................... 25 Akka HTTP ...................................................................................................26 Akka Streams ................................................................................................26 Akka 实现的Actor 模型 ......................................................................................26 Actor 模型中的Akka actor ..................................................................................26 消息传递 .......................................................................................................27 actor 系统 ...................................................................................................... 28 Akka Typed 项目 .................................................................................................. 28 结论 ....................................................................................................................29 第3 章 分布式领域驱动设计 ........................................................31 DDD 概述 ............................................................................................................31 DDD 的好处 .........................................................................................................32 DDD 组件 ............................................................................................................33 域实体 ..................................................................................................................34 域值对象 .............................................................................................................34 聚合与聚合根 ..................................................................................................... 35 仓储 .....................................................................................................................37 工厂和对象创建 ................................................................................................... 38 域服务 .................................................................................................................. 38 有界上下文 ..........................................................................................................39 结论 ....................................................................................................................41 第4 章 优秀的Actor 设计 ...........................................................43 大系统小做 ..........................................................................................................43 封装actor 中的状态 ............................................................................................44 使用字段封装状态 .......................................................................................44 使用“状态”容器封装状态 ........................................................................47 使用become 封装状态 ................................................................................. 48 将futures 与actors 混合 ............................................................................... 50 Ask 模式和替代方案 ............................................................................................ 54 Ask 模式的问题 ........................................................................................... 55 附带的复杂性 ................................................................................................ 57 Ask 的替代方案 ........................................................................................... 57 命令与事件 .......................................................................................................... 59 构造函数的依赖注入 ....................................................................................61 使用路径查找actor ......................................................................................61 结论 ....................................................................................................................62 第5 章 数据流 ............................................................................63 吞吐量与延迟 ......................................................................................................63 流 .........................................................................................................................64 路由器 ..................................................................................................................66 邮箱 ..................................................................................................................... 68 无界邮箱 ...................................................................................................... 68 有界邮箱 ......................................................................................................69 拉取的工作模式 ..................................................................................................70 背压 .....................................................................................................................73 ack .................................................................................................................73 高水位标记 ...................................................................................................73 队列长度监控 ................................................................................................74 速率监控 ......................................................................................................74 Akka 数据流.........................................................................................................74 源 .................................................................................................................. 75 汇 ..................................................................................................................77 RunnableGraph ............................................................................................. 78 流 ..................................................................................................................79 交叉点 ........................................................................................................... 80 Akka 流中的背压 ......................................................................................... 81 Akka 流的使用 ............................................................................................. 82 结论 .................................................................................................................... 84 第6 章 一致性和可扩展性 ...........................................................85 事务和一致性 ...................................................................................................... 85 强一致性与最终一致性 ....................................................................................... 86 并发性与并行性 ................................................................................................... 86 为什么全局一致的分布式状态影响可扩展性 ...................................................... 86 位置透明性 ......................................................................................................... 87 交付保证 ............................................................................................................. 87 最多投递一次 ................................................................................................ 87 最少投递一次 ................................................................................................ 88 恰好一次交付是不可能的(但可以近似做到) .............................................91 如何近似做到恰好一次交付 .........................................................................91 集群单例 .......................................................................................................92 可扩展性 ..............................................................................................................94 避免全局状态 ............................................................................................... 98 避免共享状态 ............................................................................................... 98 遵循Actor 模型 .............................................................................................99 避免顺序操作 ...............................................................................................99 隔离阻塞型操作 ...........................................................................................99 监控和调优 ..................................................................................................99 集群分片和一致性 ...............................................................................................99 分片 ............................................................................................................. 100 Akka 中的分片 ........................................................................................... 101 分片键的生成 ............................................................................................. 102 分片的分布 ................................................................................................ 103 一致性边界 ................................................................................................. 103 可扩展性边界 ............................................................................................. 104 分片聚合根 ................................................................................................ 105 持久化 ......................................................................................................... 106 钝化 ............................................................................................................. 106 使用集群分片保证一致性 ........................................................................... 107 结论 .................................................................................................................. 109 第7 章 容错 .............................................................................111 故障类型 ........................................................................................................... 112 异常 ............................................................................................................ 112 JVM 中的致命错误 .................................................................................... 113 外部服务故障 ............................................................................................. 113 不符合服务等级协议 .................................................................................. 113 操作系统和硬件级故障 .............................................................................. 114 故障隔离 ........................................................................................................... 114 舱壁模式 .................................................................................................... 114 优雅降级 ..................................................................................................... 117 使用Akka 集群隔离故障 ............................................................................ 119 使用熔断器控制故障 ................................................................................... 119 故障处理 ............................................................................................................ 122 异常处理 ..................................................................................................... 123 外部服务的故障处理 .................................................................................. 128 结论 ................................................................................................................... 131 第8 章 可用性 ..........................................................................133 微服务和单体式应用 ........................................................................................ 133 用有界上下文划分微服务 ................................................................................. 134 细粒度的微服务 ................................................................................................. 135 集群感知路由器 ................................................................................................. 135 分布式数据 ....................................................................................................... 137 优雅降级 ............................................................................................................ 140 部署 ................................................................................................................... 141 分阶段部署/ 滚动重启 ..................................................................................... 142 蓝/ 绿部署 ........................................................................................................ 142 崩溃恢复/ 运维监测 ......................................................................................... 143 健康检查和应用状态页面 .......................................................................... 143 度量 ............................................................................................................ 145 日志 ............................................................................................................. 146 看门狗工具 ................................................................................................. 146 结论 .................................................................................................................. 147 第9 章 性能 ...........................................................................149 隔离瓶颈 ........................................................................................................... 150 优化Akka ......................................................................................................... 150 减少或隔离阻塞型操作 .............................................................................. 150 缩短消息处理时间 ...................................................................................... 151 增加处理消息的actor ................................................................................ 151 派发器 ................................................................................................................ 151 标准派发器 ................................................................................................. 151 固定派发器 ................................................................................................. 153 平衡派发器 ................................................................................................ 154 calling-thread 派发器 .................................................................................. 154 何时使用单独的派发器 .............................................................................. 155 提高并行性 ................................................................................................ 157 结论 .................................................................................................................. 158 后记 ..........................................................................................159 参考文献 ...................................................................................161 关于作者 ...................................................................................162 封面介绍 ...................................................................................163

作者简介

虞航仲,创业公司技术总监。先后任职于腾讯微信团队及猎豹移动公司架构部。由于自身工作经历,对于分布式系统的设计开发有极大的热情和丰富的经验。属于比较典型的程序员,热爱编程,喜欢研究算法,也喜欢学习各种新鲜的开源项目。

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个