Akka实战:快速构建高可用分布式应用
读者评价
国人写的难得好书 Actor模型和Akka 特性解释的特别清晰 个人以为比「Akka in Action」说的明白 尤其是有几章写了 Akka Stream 和 Akka HTTP 这些高级扩展 非常受用 美中不足的是 这本书的例子是Java写的 有利有弊吧 对于初学者上手容易些 但是看起来很变扭 瑕不掩瑜!
作为首版原创Akka书籍,我认为还是OK的,里面以Java版作为基础进行讲解我认为也算是和其他同类书籍的差异化亮点了,因为Scala相关的书籍其实已经有了(貌似是翻译的...)
这本书不厚,着重实战讲解,对Stream的覆盖不够多(这块儿内容其实可以独立成书),版本的话个人认为是合适的,实际上生产环境并不一定就是用最新的。。。
总体来说,我觉得已经很好了,另外原创本身值得鼓励,可以为很多人打开了Akka的大门啊
内容介绍
本书一共分为10章,全面介绍了Akka的基础架构、Actor模型、常用组件、分布式&集群、微服务等。下面是各个章节的简介及阅读说明。第1章介绍了Akka的技术背景、应用场景及架构体系,为大家日后做技术选型提供参考依据。第2章介绍了Actor的相关概念、常见用法、生命周期、容错处理等。第3章介绍了Dispatcher的用途和常见配置方法。第4章介绍了邮箱的常见类型及配置,同时也给出了一个自定义邮箱类型的简单案例。第5章介绍了消息路由器的基本概念和创建方式(Pool和Group),然后分别演示了几种常见路由策略。第6章介绍了Akka的一些实用工具包,如Future、EventBus等。第7、8章介绍了Akka分布式&集群相关的内容。第9章介绍了如何使用Akka构建HTTP和WebSocket服务,并完整实现了一个图文聊天系统。第10章介绍了一款“全家桶式”的微服务框架Lagom。
目录
- 前言
- 第1章 认识Akka1
- 1.1 Akka简介1
- 1.1.1 技术背景1
- 1.1.2 Akka是什么3
- 1.2 Akka应用场景4
- 1.3 Akka架构体系4
- 1.3.1 Actor模型4
- 1.3.2 体系结构4
- 1.4 本章小结7
- 第2章 走进Actor8
- 2.1 Actor组件8
- 2.1.1 Akka中的Actor8
- 2.1.2 ActorSystem与监管9
- 2.1.3 生命周期监控9
- 2.1.4 引用与路径10
- 2.2 Akka环境搭建10
- 2.2.1 环境准备11
- 2.2.2 使用Lightbend Activator平台12
- 2.3 创建一个Actor14
- 2.3.1 定义Actor14
- 2.3.2 创建Actor实例14
- 2.3.3 工厂模式---Props/Creator15
- 2.4 发送-接收消息16
- 2.4.1 tell方法16
- 2.4.2 ask方法17
- 2.4.3 消息转发18
- 2.5 查找一个Actor18
- 2.6 消息不可变21
- 2.7 Actor行为切换21
- 2.8 Actor生命周期25
- 2.9 停掉一个Actor26
- 2.10 监督与容错处理29
- 2.11 Circuit Breaker(熔断)33
- 2.12 配置相关35
- 2.13 本章小结36
- 第3章 线程调度38
- 3.1 什么是Dispatcher?38
- 3.2 Executor选择39
- 3.3 配置Dispatcher39
- 3.4 使用Dispatcher41
- 3.5 PinnedDispatcher41
- 3.6 本章小结42
- 第4章 邮箱43
- 4.1 消息处理顺序43
- 4.2 默认邮箱配置44
- 4.3 内置邮箱45
- 4.3.1 内置邮箱说明45
- 4.3.2 自定义优先级45
- 4.3.3 控制指令优先48
- 4.4 Actor使用邮箱的多种方式49
- 4.4.1 配置Actor邮箱49
- 4.4.2 配置dispatcher邮箱49
- 4.4.3 实现RequiresMessageQueue接口50
- 4.5 自定义邮箱类型50
- 4.6 本章小结52
- 第5章 消息路由53
- 5.1 Router和Routee53
- 5.2 路由器及路由逻辑53
- 5.3 路由Actor56
- 5.3.1 Pool方式56
- 5.3.2 Group方式58
- 5.4 常见路由类型59
- 5.4.1 广播-Broadcast60
- 5.4.2 最快响应-ScatterGatherFirstCompleted61
- 5.4.3 随机-最快响应-TailChopping62
- 5.4.4 创建可修改容量的池62
- 5.5 特殊消息处理63
- 5.5.1 Broadcast消息64
- 5.5.2 PoisonPill消息64
- 5.5.3 其他管理类消息64
- 5.6 本章小结65
- 第6章 实用工具67
- 6.1 定时调度—Scheduler67
- 6.2 处理并发结果—Future68
- 6.2.1 Future常规用法68
- 6.2.2 函数式Future70
- 6.3 事件总线72
- 6.3.1 实现事件总线72
- 6.3.2 事件流处理74
- 6.4 日志处理75
- 6.4.1 基础配置76
- 6.4.2 使用slf4j76
- 6.5 Akka扩展78
- 6.5.1 TypedActor初探78
- 6.5.2 自定义扩展81
- 6.5.3 集成Spring83
- 6.6 Akka I/O87
- 6.6.1 TCP服务87
- 6.6.2 UDP服务90
- 6.7 Akka Streams91
- 6.7.1 Streams组件91
- 6.7.2 组合Source、Sink94
- 6.7.3 案例:日志处理95
- 6.7.4 错误处理99
- 6.7.5 关联Actor101
- 6.8 本章小结102
- 第7章 远程103
- 7.1 远程介绍103
- 7.1.1 Java RPC103
- 7.1.2 Akka远程106
- 7.2 创建远程ActorSystem107
- 7.3 Actor远程访问108
- 7.4 创建远程Actor109
- 7.5 远程路由器110
- 7.6 远程事件113
- 7.7 序列化114
- 7.7.1 Protobuf框架114
- 7.7.2 序列化API115
- 7.8 本章小结116
- 第8章 集群117
- 8.1 Akka集群概述117
- 8.1.1 种子节点118
- 8.1.2 领导节点118
- 8.1.3 节点状态及生命周期118
- 8.1.4 故障检测119
- 8.2 创建Akka集群119
- 8.2.1 代码及集群配置119
- 8.2.2 启动集群122
- 8.2.3 加入集群123
- 8.2.4 akka-cluster集群工具123
- 8.3 集群示例—实现文章单词统计125
- 8.3.1 示例分析125
- 8.3.2 代码实现127
- 8.4 使用路由133
- 8.4.1 Group路由133
- 8.4.2 Pool路由133
- 8.5 集群指标136
- 8.5.1 指标收集136
- 8.5.2 基于指标的负载均衡138
- 8.6 集群单例139
- 8.7 集群客户端140
- 8.7.1 集群客户端概述140
- 8.7.2 使用 ClusterClient141
- 8.7.3 事件监听142
- 8.8 集群分片143
- 8.8.1 分片概念143
- 8.8.2 持久化Actor144
- 8.8.3 分片示例148
- 8.9 本章小结155
- 第9章 HTTP服务156
- 9.1 HTTP协议156
- 9.1.1 header信息157
- 9.1.2 状态码159
- 9.2 Akka HTTP159
- 9.2.1 配置依赖159
- 9.2.2 HTTP服务端160
- 9.2.3 请求和响应160
- 9.2.4 HTTP客户端163
- 9.2.5 使用Routing DSL163
- 9.2.6 常用Directive165
- 9.3 Akka WebSocket166
- 9.3.1 WebSocket协议167
- 9.3.2 Akka WebSocket167
- 9.3.3 WebSocket应用之聊天室169
- 9.4 本章小结176
- 第10章 微服务全家桶之Lagom177
- 10.1 Lagom简介177
- 10.2 Lagom初探178
- 10.3 搭建Lagom服务181
- 10.3.1 项目结构181
- 10.3.2 编写Lagom服务182
- 10.4 持久化实体186
- 10.4.1 持久化简介186
- 10.4.2 PersistentEntity API187
- 10.4.3 持久化示例187
- 10.4.4 MySQL支持191
- 10.5 Lagom部署(SandBox)192
- 10.5.1 安装ConductR SandBox192
- 10.5.2 部署Maven项目195
- 10.6 本章小结199
业务需要,小组内部搭建了一个基于akka简单的分布式集群,尽量轻量级。 业务场景,简要说下,目前业务数据量比较大,且还在以每天几十万的数据量递增,现在需要根据这些历史数据,从不同的维度,且维度可能组合,统计相关业务数据,其中包括数据挖掘,数据运营,同时还有可能业务告警,同时还要求数据尽量及时,而且考虑到后续可扩展,可以增加任意其他维度,能够快速响应等, 从上面的描述中,我们可以提供几个关键字,大数据,实时统计,多维度统计,快速接入等,这些其实公司内部是有些平台和框架可以满足的,用hadoop跑job来解决,但不够实时,且接入还是有点麻烦,所以我们产生了一个想法,自己搭建一个小型集群,毕竟数据量不是很大,而且akka这个框架,宣传还是挺强大的,也比较成熟,但也需要能够驾驭它,引入一种新技术,最好还是能够解决一些问题,并且有足够的驾驭能力,否则发布到线上,有问题的话,那就死翘翘了,这里我将分几个部分,把最近学习的一些akka心得,记录在此,前面我写过的文章可能都虎头蛇尾,但后续会慢慢补上,零碎的时间比较多,没法集中精力和时间来系统学习,只能能够用这种方式来写这些文章了。
Actor是什么 曾经看到知乎上有人提过actor就是cpu上的时间片,这种说法非常贴切。Actor之间通过消息进行通讯,一切都是异步的。可以说Actor就像现实生活中的一群人,他们各司其职,互相通过消息进行交流,一个actor收到另外一个actor发来的消息后会按照消息的内容去执行指定的任务,接着再将新任务传递下去或者将执行结果返回给消息发送方。Actor这种模型很好地解决了传统java并发带来的各种问题。 Actor和线程的区别 Actor规避了传统多线程中锁的问题,在Actor中是没有共享变量的,一切都是无状态的,尽管我们可以在actor中去调用一个新的线程去进行一些异步操作,但是这并不符合Actor本身的理念,并且会破坏Actor的整体设计。要记住一点,Actor是单线程运行的,一个Actor同时只能处理一条消息,我们可以通过增加Actor的数量来提高系统并行处理的能力。 Actor是如何执行的 AKKA中使用dispatcher对actor进行执行,当一个actor启动之后会将自身绑定到一个dispatcher上,我们可以在系统配置中定义自己的dispathcer。Dispatcher本身其实是一个线程池,默认的dispatcher是一个fork-join-executor,读者可以参考下表来了解不通的dispatcher。