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