第1章 Akka简介15 d! h5 S b c6 q O8 @# Z- J1 p
1.1 什么是Akka?3
7 [4 \% R9 b$ }: c" q! I4 A1.2 Actor简介4
7 p& d* f! T. l$ r ~9 V1.3 两种扩展方法:建立我们的实例48 G) P5 X2 t1 \& O1 M
1.4 传统扩展58 P4 c, S. e% A3 h
1.4.1 传统扩展和持久性:一切移入数据库6
& E. E" U! U' Z- p0 A& F& u1.4.2 传统扩展和交互应用:轮询8
7 \# |! Q6 i9 ^$ l9 e0 o6 e1.4.3 传统扩展和交互应用:Web服务9 N; @9 R! ^6 v# ^* K1 |2 q
1.5 用Akka进行扩展10, \' d) S$ N+ q2 k/ Q
1.5.1 用Akka扩展和持久化:发送和接收消息11
0 U6 F$ ^. j2 u0 E1.5.2 用Akka扩展和交互应用:消息推送13# ]' L. z" c$ ~/ N: ~
1.5.3 用Akka扩展和容错:异步解耦14) u% m5 j4 L5 ~# t
1.5.4 Akka方式:发送和接收消息15
: ]( S0 Q h4 }1.6 Actor:向上和向外扩展的编程模型16
+ M! @: Q9 H4 e0 J8 x# k" w1.6.1 异步模型16
# x5 [- g, t& O- p& T" r1.6.2 Actor操作17
. \' o- [: o) s4 L1.7 Akka Actor20! v q1 t w8 j9 O: R3 E
1.7.1 ActorSystem20: F. b) N' j$ H: L$ [2 c: {
1.7.2 ActorRef、邮箱和Actor21$ @% W4 q0 g- ^# [, `2 w2 q
1.7.3 分发器21* E% O( C* k+ H. I
1.7.4 Actor和网络24
9 d1 z- E2 P$ q( F" R/ |1.8 总结24
- b2 n) m6 A$ H* Y4 E第2章 搭建和运行25! P) C, z7 v# A$ M- a1 _* @
2.1 克隆、构建和测试接口25/ {1 f' E# p" [& G. \
2.1.1 用sbt进行构建26
; l1 w" |& |0 ]2.1.2快进到GoTicks.com REST服务器28
3 b5 H$ x7 f B' V* X2.2 探索应用中的app32; ` ]: ~) V" Q5 A
2.2.1 app结构32
9 s6 Y: ]3 a9 m$ u2.2.2 处理销售的Actor:TicketSeller39
" d- y2 _. X1 ], b( s/ d2.2.3 BoxOffice Actor408 |! H$ i. ?! o [7 j
2.2.4 RestApi43. _8 t a* g! ]: X2 X1 x
2.3 部署到云上463 [! t8 [& H% {: ?, |: A7 Q2 I2 u7 k+ P
2.3.1 在Heroku上创建app46& p7 K7 D. b' o" S
2.3.2 在Heroku上部署并运行48
5 \; Y0 H- V3 f7 [; X8 I$ a4 u% `% m2.4 总结497 ~8 ?: Q7 F e* m1 R
第3章 Actor测试驱动开发50, U" Q. |% a6 c# _9 `; F7 O
3.1 测试Actor50
* Z/ c# B* z H3 Q0 y4 o4 X3.2 单向消息52
: b/ {) E% P p; D4 k6 E9 d+ `3.2.1 SilentActor实例52
% f0 R8 X+ p @- `! B9 x3.2.2 SendingActor实例57
# e/ Y, U+ ~# t! x3.2.3 SideEffectingActor实例63( K' H: S& `7 {8 [0 W o
3.3 双向消息66
N2 J6 n$ b# p1 Q+ H3 D" w, ~3.4 总结681 p7 S1 b8 U+ c1 b" `& e
第4章 容错69
! }7 s2 j- b/ U) h2 _3 H/ ]4.1 容错是什么(不是什么)?69
0 e* W: q9 _9 t% w$ q/ x4.1.1 普通对象与异常70& N6 w: Z0 n7 x- ~. W* p
4.1.2 Let it crash73$ n7 H P' b. `7 C7 |7 E" h/ m
4.2 Actor生命周期76- e0 N2 ~( w' k5 o V. D; Z
4.2.1 启动事件774 S5 \4 o5 B5 l/ }$ ^
4.2.2 停止事件78
7 V0 m4 [3 H6 T# D: I/ m4.2.3 重启事件78
) T C2 p0 L6 Z9 M- F& g4.2.4 生命周期综合80
' W6 k; q5 G' M @' B& Y p3 o' c4.2.5 生命周期监控82
3 H; ~% w, _$ s, ?+ U- y' C* \4.3 监视83# ~3 s* S* [/ [3 O: S1 h
4.3.1 监视器层次结构83
$ \( ]) b X: l% P0 l+ M4.3.2 预定义策略85
0 B, H: p, a- s. }4.3.3 自定义策略87
( ?+ z+ C# }$ `% L" _# y+ S3 H- |4.4 总结94+ L h5 u6 W1 Y# j8 y% G. ^+ {' P
第5章 Futures95% T' v/ a2 |! A' R0 R" Y }$ H
5.1 Future的应用实例958 a9 t: h/ f' r p+ e
5.2 Future无阻塞99* A) E" q0 j e7 @7 i
5.3 Future错误处理106
) }; S d% d$ e; Z5 ]( b% [5.4 Future组合1118 d, p9 i; Q+ D. J1 n
5.5 Future组合Actor122 y, u$ i" ~$ B! d. f
5.6 总结1231 i# t% ?' }% v7 k# @. _
第6章 个分布式Akka app125
8 ]8 t0 Z7 [5 U3 k6.1 向外扩展1253 h9 d$ N4 D0 Z2 G( `) ~
6.1.1 通用网络术语125& i; h2 d! I T
6.1.2 采用分布式编程模型的原因126
, U1 b+ V- Q# |) V& T1 r6.2 远程扩展127
$ i8 K; @' @2 T6.2.1 把GoTicks.com app改造成分布式应用128- K- b: A# h6 h% ^$ ^
6.2.2 远程REPL活动129
5 U' R0 W+ T! |2 Z {6.2.3 远程查找135
2 k( K0 {2 T+ n. ^# q. k! J6.2.4 远程部署143. s1 H5 k* K T# N
6.2.5 多JVM测试149
( m- H( {# D* v' I7 k y0 ?" V5 P6.3 总结156
6 r7 C+ P; U9 m0 c [2 U第7 章 配置、日志和部署158
/ L( G& B- \) m2 B0 X) f0 n7.1 配置158: T5 |: ?2 I0 z# m0 g' l
7.1.1 尝试Akka配置158
# c- h E# k; W, P" ]7.1.2 使用默认值162
9 |$ I6 c; P6 g, V( F( P& N. Y+ s7.1.3 Akka配置165& S) c) t q) Z( u: I) h
7.1.4 多系统166
) e& H3 ?9 x0 ?5 O$ w( k7.2 日志168
* _! v* [9 u3 W( s' a. [& t7.2.1 Akka中的日志记录168
/ Y' Y: T7 _) K. r$ o$ n" n* a N7.2.2 使用日志170& H A+ n) _, n" e9 `# x
7.2.3 Akka的日志控制171: w i+ r1 }/ W0 g
7.3 部署基于Actor的应用173
! S2 h z. B9 c- k1 p7.4 总结178$ @3 z: c1 S% X" Z0 @
第8章 Actor的结构模式1797 K# ^) p5 l5 q& U+ n0 `5 T y$ y
8.1 管道和过滤器179
8 R, b' g1 G5 O8 ^! H! Z8.1.1 企业集成模式:管道和过滤器179
* T/ q9 M0 l$ @8 g( I. D c8.1.2 Akka中的管道和过滤器180
/ M) J6 Y! r- ~/ s2 R8.2 企业集成模式:分发-收集模式185# m6 p( K4 R7 R- D2 W" E
8.2.1 适用性185
; \0 E+ v. X C2 a7 h1 [8.2.2 Akka处理并行任务187
% G& [' |2 z+ B% S* X$ y& x' L8.2.3 使用接收者列表实现分发组件188& f& @# s/ B$ l, u; \
8.2.4使用聚合器模式实现收集组件1894 ^* A9 S9 M9 p
8.2.5 组合组件实现分发-收集模式198- U% i& o+ i/ b: f$ \1 ~4 F" V
8.3 企业集成模式:路由表模式199- k4 z4 v1 |5 ~; ]
8.4 总结205/ C6 Y4 p2 c0 W# n5 H8 Z
第9章 路由消息207
# c0 j+ M) A% z o$ U& n9.1 企业集成路由模式207# g, b/ [* ]$ \2 i2 Y( ]9 ]
9.2 使用Akka Router实现负载平衡208
; ~9 {% Q" I+ b) e9.2.1 Akka Router池211: Q4 ?* }8 Z; |7 g+ \
9.2.2 Akka Router群组217+ E2 P% A/ h' t( ~8 S3 i( t5 V
9.2.3 ConsistentHashing Router225
2 T4 }+ @8 H9 z& o5 n9.3 用Actor实现路由模式229
" d! ~7 Z# i# H3 s' e, z8 w! ^) c o9.3.1 基于内容的路由229& {# G, _; W+ w! _) N* a* f% r
9.3.2 基于状态的路由230
2 |; P& B' ~, g9.3.3 Router的实现233
+ I* f/ n1 z2 U9.4 总结234" V5 U& z+ U* \8 t' A2 h. D
第10章 消息通道235; d1 X: E8 @# T/ A) A
10.1 通道类型235# Q. i+ a8 o) g! r/ X
10.1.1 点对点通道235
0 W7 d% w1 P( p% K3 n" G10.1.2 发布-订阅通道2360 j: L/ o# ~% T# I1 r
10.2 特殊通道245. x2 k9 m% H+ G
10.2.1 死信245
: N l" E- L; X# K. ^' N- M10.2.2 保证投递248
7 n1 t3 }8 w1 F/ R0 i, Q* L10.3 总结254
' D6 I; D4 Y+ C# r% p第11章 有限状态机和代理256
6 q- J% ~3 j3 D8 o1 O11.1 使用有限状态机256% a: T3 {0 r1 g4 z9 L. x
11.1.1 有限状态机简介256) E Z% Q% L- K v
11.1.2 创建FSM模型257- i# J: }3 X5 P/ E% w" Z
11.2 FSM模型的实现258
4 ]6 f+ n0 f+ p/ l5 f. O- K11.2.1 实现转换259
; k( y; C8 B' y7 x, |2 }11.2.2 实现入口动作264 F. y" [, f' F
11.2.3 FSM定时器270& Y. V1 _0 X. l1 c" I
11.2.4 FSM的终止2730 u" v- T5 Q0 V
11.3 使用代理实现共享状态274* a0 q6 f8 I3 }! N( Y3 S" T% ]
11.3.1 使用代理简单地共享状态274
8 G' N4 h' J& k4 ^" g11.3.2 等待状态更新276, l8 q; T& k8 `& W2 S( I
11.4 总结277
" d+ h% q- N) i+ S W$ U8 D第12章 系统集成278* U. d1 M0 A9 J- B& H7 B
12.1 消息终端278
4 k1 {, B- d; o8 y, b$ c8 \12.1.1 归一化279
' z' W" { _4 d12.1.2 规范数据模型280
. t: M& ^! k1 F12.2 使用Apache Camel实现终端282
1 m3 ^% j: U: ^" @9 d! z# b4 O12.2.1 创建从外部系统接收消息的消费者终端283* }" u/ x j2 [& H9 Y3 @6 v; w
12.2.2 实现生产者向外部系统发送消息291
# S$ _; ~ G0 A12.3 实现HTTP接口297) D, I& I; W' Q
12.3.1 HTTP实例298
$ u9 Y' x: Y' v" K# g, _$ v- [12.3.2 用Akka-http实现REST终端300
$ d, u2 d( y ?! S3 w- `12.4 总结307' v' H( k0 E$ \6 F( H H
第13章 流3094 ?* ~7 F4 U# S# Z$ N7 A8 q9 J4 Z+ j
13.1 基本流处理309
2 r9 U0 j6 A! s13.1.1 使用源和接收器复制文件313" J9 B# @- f* D( M
13.1.2 实体化可运行图316
. U5 K( N% x8 \; }/ x& E# f2 E13.1.3 用Flow处理事件321& S+ }/ \* \. b* A
13.1.4 处理流中的错误3249 Q6 f8 P7 H1 e2 g9 B) F- S" J
13.1.5 用BidiFlow创建协议326
6 S; J2 k0 G$ y; b; O13.2 HTTP流330
. v$ @! r# |# |13.2.1接收HTTP流330+ h; Y$ x; w0 D! ~! J$ K- v6 t; Z
13.2.2 HTTP响应流333
6 a9 p; G* r( Q; Y/ |$ F3 f13.2.3 内容类型和协调的自定义编组与解组334
: U7 q" g) z. u, u+ ^, H# t13.3 用Graph DSL进行扇入和扇出340
5 `+ H* U- K$ x# o: W13.3.1 广播流340
6 N, Q- B O; p* e13.3.2 合并流343
7 m% \ t1 E6 F3 J# |, D4 s13.4 协调生产者和消费者347
) K4 B0 z/ j8 W- E: H' R13.4.1 使用缓冲区347
, K* ~7 W# B# n' {9 i13.5 图的速率隔离350 K0 A% J8 j p2 t
13.5.1 对较慢的消费者,对事件进行汇总351
) X, e! Q( f# M! M8 y5 n13.5.2 快速消费者的扩展度量3513 g% w4 G9 X5 w+ S
13.6 总结352 java8.com/ C/ R: c' q( O" K( Y2 h
第14章 集群353
( w" c' b3 Z/ v2 @9 x14.1 为什么使用集群?353
% K- O3 Y# C$ Y9 J5 i8 y, o9 b! y' [14.2 集群成员关系355
3 H4 L- v2 @3 W- T14.2.1 加入集群356& R1 L1 a5 a1 @9 W
14.2.2 离开集群3644 B6 O3 w X' Y; d. k* t9 z
14.3 集群作业处理369
6 O4 ?6 H, x" m' i1 m14.3.1 启动集群! L! p- S6 v* y6 a: F1 D- |4 r