Вы находитесь на странице: 1из 119

Akka:

Simpler Concurrency, Scalability &


Fault-tolerance through Actors

Jonas Bonér
@jboner

Tuesday, July 20, 2010


We believe that...
• Writing correct concurrent
applications is too hard

• Scaling out applications is


too hard

• Writing highly fault-tolerant


applications is too hard
Tuesday, July 20, 2010
It doesn’t have to
be like this
We need to raise the
abstraction level
Tuesday, July 20, 2010
Locks & Threads
are...

Tuesday, July 20, 2010


...sometimes
plain evil
Tuesday, July 20, 2010
...but always the
wrong default
Tuesday, July 20, 2010
“Threads are to Concurrency as
Witchcraft is to Physics”

“Hanging by a thread is the punishment


for Shared State Concurrency”

- Gilad Bracha

Tuesday, July 20, 2010


Actors
one tool in the toolbox

Tuesday, July 20, 2010


Actor Model of
Concurrency
• Implements Message-Passing Concurrency
• Share!NOTHING
• Isolated lightweight processes
• Communicates through messages
• Asynchronous and non-blocking
• Each actor has a mailbox (message queue)

Tuesday, July 20, 2010


Actor Model of
Concurrency
• Easier to reason about
• Raised abstraction level
• Easier to avoid
–Race conditions
–Deadlocks
–Starvation
–Live locks
Tuesday, July 20, 2010
Introducing

STM Actors Agents


Dataflow Distributed Open Source

RESTful Secure Persistent


Tuesday, July 20, 2010
ARCHITECTURE

CORE
SERVICES

Tuesday, July 20, 2010


ARCHITECTURE

ADD-ON
MODULES

Tuesday, July 20, 2010


ARCHITECTURE

ENTERPRISE
MODULES

Tuesday, July 20, 2010


Akka Actors

Tuesday, July 20, 2010


Two different models
• Thread-based
• Event-based
– Very!lightweight (600 bytes per actor)
– Can easily create!millions!on a single
workstation (6.5 million on 4 G RAM)
– Does not consume a thread

Tuesday, July 20, 2010


Actors
!"#$%&'($!)!"#$%

!*"##!&'()*+,!$+)$,-#!-$*',!.
!!./01")$!1"/!$'()*+,!/!0

!!-$2!,+$+#1+!/!.
!!!!!"#$!"#$%!/2!
!!!!!!$'()*+,!3/!4
!!!!!!5,#)*6)7$'()*+,8
!!9
9

Tuesday, July 20, 2010


Create Actors
03.&/)!-$*',:;

1"*!$'()*+,!/!<$*',=>?&'()*+,@

$'()*+, is an -$*',A+>
Tuesday, July 20, 2010
Create Actors

1"*!<$*',!/!<$*',=>7,$4!BC-$*',7::88

create actor with constructor arguments

Tuesday, July 20, 2010


Start actors

1"*!$'()*+,!/!<$*',=>?&'()*+,@
$'()*+,:D*<,*

Tuesday, July 20, 2010


Start actors

1"*!$'()*+,!/!<$*',=>?&'()*+,@:D*<,*

Tuesday, July 20, 2010


Stop actors

1"*!$'()*+,!/!<$*',=>?&'()*+,@:D*<,*
$'()*+,:D*'5

Tuesday, July 20, 2010


init & shutdown callbacks
!*"##%BC-$*',!$+)$,-#!-$*',!.

%%&1$//0-$%-$2!#)#*!/!.
!!!!:::!EE!$<66+F!<>*+,!GD*<,*H!
!!9

!!&1$//0-$%-$2!DI(*F'J)!/!.
!!!!:::!EE!$<66+F!K+>',+!GD*'5H
!!9
9

Tuesday, July 20, 2010


the self reference
!*"##!A+$(,D#1+-$*',!$+)$,-#!-$*',!.
!!./01")$!1"/!$'()*+,!/!0
!!D+6>:#F!/!LD+,1#$+M,+$(,D#1+N

!!-$2!,+$+#1+!/!.
!!!!!"#$!"#$%!/2!
!!!!!!$'()*+,!3/!4
!!!!!!D+6>!O!"#$%
!!9
9

Tuesday, July 20, 2010


Actors
anonymous
1"*%J',%+,!/!<$*',!.
!!!"#$!P',%7>)8!/2!>)78
9

Tuesday, July 20, 2010


Send: !

$'()*+,!O!"#$%!

fire-forget

Tuesday, July 20, 2010


Send: !!

1"*!,+D(6*!/!7<$*',!OO!B+DD<Q+8:<D?R*,#)Q@

uses Future under the hood (with time-out)

Tuesday, July 20, 2010


Send: !!
1"*!,+D(6*=5*#')!/!<$*',!OO!B+DD<Q+

1"*!,+D(6*!/!,+D(6*=5*#')
!!!!!!!!!!!!:Q+*=,S6D+7F+><(6*A+D(6*8

1"*!,+D(6*!/!,+D(6*=5*#'):Q+*=,S6D+7
!!!!)5/&4%,$4!ST$+5*#')7L"#U+F!'(*N888

returns an Option[ResultType] directly


Tuesday, July 20, 2010
Send: !!!
EE!,+*(,)D!<!>(*(,+
1"*!>(*(,+!/!<$*',!OOO!B+DD<Q+
>(*(,+:<J<#*
1"*!,+D(6*!/!>(*(,+:Q+*

:::
V(*(,+D:<J<#*=)+7W#D*7>(*4X!>(*YX!:::88
V(*(,+D:<J<#*-667W#D*7>(*4X!>(*YX!:::88

returns the Future directly


Tuesday, July 20, 2010
Reply
!*"##!R'U+-$*',!$+)$,-#!-$*',!.
!!-$2!,+$+#1+!/!.
!!!!!"#$!ZD+,7)<U+8!/2!
!!!!!!EE!(D+!,+56C
!!!!!!D+6>:,+56C7L[#!N!3!)<U+8
!!9
9

Tuesday, July 20, 2010


Reply
!*"##!R'U+-$*',!$+)$,-#!-$*',!.
!!-$2!,+$+#1+!/!.
!!!!!"#$!ZD+,7)<U+8!/2!
!!!!!!EE!D*',+!<J<C!*I+!D+)F+,
!!!!!!EE!*'!(D+!6<*+,!',!
!!!!!!EE!D'U+JI+,+!+6D+
!!!!!!:::!/!D+6>:D+)F+,
!!9
9

Tuesday, July 20, 2010


Reply
!*"##!R'U+-$*',!$+)$,-#!-$*',!.
!!-$2!,+$+#1+!/!.
!!!!!"#$!ZD+,7)<U+8!/2!
!!!!!!EE!D*',+!<J<C!*I+!D+)F+,!>(*(,+
!!!!!!EE!*'!,+D'61+!6<*+,!',!
!!!!!!EE!D'U+JI+,+!+6D+
!!!!!!:::!/!D+6>:D+)F+,V(*(,+
!!9
9

Tuesday, July 20, 2010


Good immutable messages
EE!F+>#)+!*I+!$<D+!$6<DD
!"#$%!*"##!A+Q#D*+,7(D+,M!ZD+,8

EE!$,+<*+!<)F!D+)F!<!)+J!$<D+!$6<DD!U+DD<Q+
<$*',!O!A+Q#D*+,7(D+,8

EE!*(56+D
<$*',!O!7(D+,)<U+X!5<DDJ',F8

EE!6#D*D
<$*',!O!W#D*7LK#66NX!LK'KNX!L<6#$+N8

Tuesday, July 20, 2010


Akka Dispatchers

Tuesday, July 20, 2010


Dispatchers
&'($!)!\#D5<*$I+,D!.
!!-$2!)+JST+$(*',]<D+FS1+)*\,#1+)\#D5<*$I+,7)<U+M!R*,#)Q8

!!-$2!)+JST+$(*',]<D+FS1+)*\,#1+)P',%R*+<6#)Q\#D5<*$I+,7)<U+M!R*,#)Q8

!!-$2!)+J"I,+<F]<D+F\#D5<*$I+,7<$*',M!-$*',A+>8
!!
!!-$2!)+JA+<$*',]<D+F"I,+<F^''6S1+)*\,#1+)\#D5<*$I+,7)<U+M!R*,#)Q8

!!-$2!)+JA+<$*',]<D+FR#)Q6+"I,+<FS1+)*\,#1+)\#D5<*$I+,7)<U+M!R*,#)Q8
9

Tuesday, July 20, 2010


Set dispatcher
!*"##!BC-$*',!$+)$,-#!-$*',!.
!!D+6>:F#D5<*$I+,!/!\#D5<*$I+,D
!!!!:)+J"I,+<F]<D+F\#D5<*$I+,7D+6>8
!!
!!:::
9

<$*',:F#D5<*$I+,!/!F#D5<*$I+,!EE!K+>',+!D*<,*+F

Tuesday, July 20, 2010


EventBasedDispatcher
Fluent DSL
1"*!F#D5<*$I+,!/
!!\#D5<*$I+,D:)+JST+$(*',]<D+FS1+)*\,#1+)\#D5<*$I+,
F#D5<*$I+,!!!!
!!!!:J#*I_+J"I,+<F^''6P#*I]'()F+F]6'$%#)Q`(+(+74008
!!!!:D+*&',+^''6R#a+74b8
!!!!:D+*B<T^''6R#a+74Yc8
!!!!:D+*d++5-6#1+"#U+e)B#66#D7b00008
!!!!:D+*A+f+$*#')^'6#$C7,$4!&<66+,A()D^'6#$C8
!!!!:K(#6F"I,+<F^''6

Tuesday, July 20, 2010


MessageQueues
Unbounded LinkedBlockingQueue
Bounded LinkedBlockingQueue
Bounded ArrayBlockingQueue
Bounded SynchronousQueue

Plus different options per queue

Tuesday, July 20, 2010


ActorRegistry
1"*!<$*',D!/!-$*',A+Q#D*,C:<$*',D
1"*!<$*',D!/!-$*',A+Q#D*,C:<$*',DV',?"g^S@
1"*!<$*',D!/!-$*',A+Q#D*,C:<$*',DV',7#F8
1"*!<$*',!/!-$*',A+Q#D*,C:<$*',V',7((#F8

-$*',A+Q#D*,C:>',+<$I7>)8
-$*',A+Q#D*,C:DI(*F'J)-66

Tuesday, July 20, 2010


Let it crash
fault-tolerance

Tuesday, July 20, 2010


Stolen from

Erlang
Tuesday, July 20, 2010
9 nines
Tuesday, July 20, 2010
OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


OneForOne
fault handling strategy

Tuesday, July 20, 2010


AllForOne
fault handling strategy

Tuesday, July 20, 2010


AllForOne
fault handling strategy

Tuesday, July 20, 2010


AllForOne
fault handling strategy

Tuesday, July 20, 2010


AllForOne
fault handling strategy

Tuesday, July 20, 2010


Supervisor hierarchies

Tuesday, July 20, 2010


Supervisor hierarchies

Tuesday, July 20, 2010


Supervisor hierarchies

Tuesday, July 20, 2010


Supervisor hierarchies

Tuesday, July 20, 2010


Fault handlers
-66V',=)+R*,<*+QC7
!!U<T_,=>A+*,#+DX!
!!J#*I#)"#U+A<)Q+8

=)+V',=)+R*,<*+QC7
!!U<T_,=>A+*,#+DX!
!!J#*I#)"#U+A<)Q+8

Tuesday, July 20, 2010


Linking
6#)%7<$*',8!
()6#)%7<$*',8!

D*<,*W#)%7<$*',8
D5<J)W#)%?BC-$*',@

Tuesday, July 20, 2010


trapExit
*,<5ST#*!/!W#D*7
!$6<DD=>?R+,1#$+ST$+5*#')@X!
!$6<DD=>?^+,D#D*+)$+ST$+5*#')@8

Tuesday, July 20, 2010


Supervision
!*"##!R(5+,1#D',!$+)$,-#!-$*',!.
!!03.&/)!D+6>:;
!!*,<5ST#*!/!W#D*7$6<DD=>?"I,'J<K6+@8
!!><(6*[<)F6+,!/!
!!!!R'U+7=)+V',=)+R*,<*+QC7hX!h00088

!!-$2!,+$+#1+!/!.
!!!!!"#$!A+Q#D*+,7<$*',8!/2!
!!!!!!6#)%7<$*',8
!!9
9
Tuesday, July 20, 2010
Manage failure
!*"##!V<(6*"'6+,<)*R+,1#$+!$+)$,-#!-$*',!.
!!:::
!!&1$//0-$%-$2!5,+A+D*<,*7,+<D')M!"I,'J<K6+8!/!.
!!!!:::!EE!$6+<)!(5!'$2&/$!,+D*<,*
!!9
!!&1$//0-$%-$2!5'D*A+D*<,*7,+<D')M!"I,'J<K6+8!/!.
!!!!:::!EE!#)#*!"2)$/!,+D*<,*
!!9
9

Tuesday, July 20, 2010


Remote Actors

Tuesday, July 20, 2010


Remote Server
EE!(D+!I'D*!i!5',*!#)!$')>#Q
A+U'*+_'F+:D*<,*

A+U'*+_'F+:D*<,*7j6'$<6I'D*jX!kkkk8

Scalable implementation based on


NIO (Netty) & Protobuf

Tuesday, July 20, 2010


Two types of
remote actors
•Client-initated and managed
•Server-initiated and managed

Tuesday, July 20, 2010


Client-managed
supervision works across nodes

EE!U+*I'FD!#)!-$*',!$6<DD

D5<J)A+U'*+?BC-$*',@7I'D*X!5',*8!

D5<J)W#)%A+U'*+?BC-$*',@7I'D*X!5',*8

D*<,*W#)%A+U'*+7<$*',X!I'D*X!5',*8

Tuesday, July 20, 2010


Client-managed
moves actor to server
client manages through proxy

1"*!<$*',^,'TC!/!D5<J)W#)%A+U'*+?BC-$*',@7
!!LF<,%D*<,NX!
!!kkkk8

<$*',^,'TC!O!U+DD<Q+

Tuesday, July 20, 2010


Server-managed
register and manage actor on server
client gets “dumb” proxy handle

A+U'*+_'F+:,+Q#D*+,7
!!LD+,1#$+M#FNX!<$*',=>?BCR+,1#$+@8

server part

Tuesday, July 20, 2010


Server-managed
1"*!I<)F6+!/!A+U'*+&6#+)*:<$*',V',7
!!LD+,1#$+M#FNX!
!!LF<,%D*<,NX!
!!kkkk8

I<)F6+!O!U+DD<Q+

client part
Tuesday, July 20, 2010
Cluster Membership
&6(D*+,:,+6<CB+DD<Q+7
!!$6<DD=>?"C5+=>-$*',@X!U+DD<Q+8

2&/%7+)F5'#)*!lm!&6(D*+,8!
!!D5<J)A+U'*+?"C5+=>-$*',@7!!
!!!!!!!!!!!!!!+)F5'#)*:I'D*X!
!!!!!!!!!!!!!!+)F5'#)*:5',*8

Tuesday, July 20, 2010


STM
another tool in the toolbox

Tuesday, July 20, 2010


What is STM?

60
Tuesday, July 20, 2010
STM: overview
• See the memory (heap and stack) as a
transactional dataset
• Similar to a database
• begin
• commit
• abort/rollback
• Transactions are retried automatically
upon collision
• Rolls back the memory on abort
Tuesday, July 20, 2010
Managed References
• Separates Identity from Value
- Values are immutable
- Identity (Ref) holds Values
• Change is a function
• Compare-and-swap (CAS)
• Abstraction of time
• Must be used within a transaction

Tuesday, July 20, 2010


Managed References
1"*!,+>!/!A+>7B<5?R*,#)QX!ZD+,@788

1"*!(D+,D!/!,+>:Q+*

1"*!)+JZD+,D!/!(D+,D!3!7LK#66N!m2!ZD+,7LK#66N88

,+>:DJ<57)+JZD+,D8

Tuesday, July 20, 2010


Transactional
datastructures

1"*!(D+,D!/!",<)D<$*#')<6B<5?R*,#)QX!ZD+,@78

1"*!(D+,D!/!",<)D<$*#')<6n+$*',?ZD+,@78

Tuesday, July 20, 2010


STM: API
03.&/)!",<)D<$*#'):W'$<6:;

<*'U#$!.
!!:::
!!<*'U#$!.!EE!)+D*+F!*,<)D<$*#')D!$'U5'D+
!!!!:::!EE!F'!D'U+*I#)Q!J#*I#)!<!*,<)D<$*#')
!!9
9

Tuesday, July 20, 2010


Actors + STM =
Transactors

Tuesday, July 20, 2010


Transactors
!*"##!ZD+,A+Q#D*,C!$+)$,-#!",<)D<$*',!.
!!
!!./01")$%1"*!D*',<Q+!/!
!!!!",<)D<$*#')<6B<5?R*,#)QX!ZD+,@78

!!-$2!,+$+#1+!/!.
!!!!!"#$!_+JZD+,7(D+,8!/2
!!!!!!D*',<Q+!3!7(D+,:)<U+!m2!(D+,8
!!!!:::!
!!9
9

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors
Start transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Transaction
fails

Tuesday, July 20, 2010


Transactors
Start transaction

Send message

Update state
within transaction

Transaction
fails

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors

Tuesday, July 20, 2010


Transactors
Transaction
automatically
retried

Tuesday, July 20, 2010


Agents
yet another tool in the toolbox

Tuesday, July 20, 2010


Agents
1"*!<Q+)*!/!-Q+)*7h8

EE!D+)F!>()$*#')!<DC)$I,')'(D6C
<Q+)*!D+)F!7;!3!48!

1"*!,+D(6*!/!<Q+)*78!EE!F+,+>
:::!EE!(D+!,+D(6*

<Q+)*:$6'D+

Cooperates with STM


Tuesday, July 20, 2010
(some of the)

Modules

Tuesday, July 20, 2010


Akka Spring

Tuesday, July 20, 2010


Spring integration
lK+<)D2
!!l<%%<M<$*#1+m'Kf+$*!#F/jUC-$*#1+=Kf+$*j!
!!!!!!!!!!!!!!!!!!!!!!*<,Q+*/j$'U:K#a:BC^=o=j!
!!!!!!!!!!!!!!!!!!!!!!*,<)D<$*#')<6/j*,(+j!
!!!!!!!!!!!!!!!!!!!!!!*#U+'(*/j4000j!E2
!!:::
lEK+<)D2

Tuesday, July 20, 2010


Spring integration
6<%%<MD(5+,1#D#')!#F7jUCmD(5+,1#D',j8

!!6<%%<M,+D*<,*9D*,<*+QC!><#6'1+,7j-66V',=)+j!
!!!!!!!!!!!!!!!!!!!!!!!!!,+*,#+D7jpj!
!!!!!!!!!!!!!!!!!!!!!!!!!*#U+,<)Q+7j4000j8
!!!!6<%%<M*,<59+T#*D8
! !!6<%%<M*,<59+T#*8f<1<:#':e=ST$+5*#')6;<%%<M*,<59+T#*8
!!!!6;<%%<M*,<59+T#*D8
!!6;<%%<M,+D*<,*9D*,<*+QC8

!!6<%%<M<$*#1+9'Kf+$*D8
!!!!6<%%<M<$*#1+9'Kf+$*!*<,Q+*7j$'U:K#a:BC^=o=j!
!!!!!!!!!!!!!!!!!!!!!!!!6#>+$C$6+7j5+,U<)+)*j!
!!!!!!!!!!!!!!!!!!!!!!!!*#U+'(*7j4000j8
!!!!!!6<%%<M,+D*<,*9$<66K<$%D!5,+7j5,+A+D*<,*j!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5'D*7j5'D*A+D*<,*j;8
!!!!6;<%%<M<$*#1+9'Kf+$*8
!!6;<%%<M<$*#1+9'Kf+$*D8
6;<%%<MD(5+,1#D#')8

Tuesday, July 20, 2010


Akka Camel

Tuesday, July 20, 2010


Camel: consumer
!*"##!BC&')D(U+,!$+)$,-#!-$*',!40)5!&')D(U+,!.
!!-$2!+)F5'#)*Z,#!/!j>#6+MF<*<E#)5(*j
!
!!-$2!,+$+#1+!/!.
!!!!!"#$!UDQM!B+DD<Q+!/2!
!!!!!!6'Q:#)>'7j,+$+#1+F!qDj!>',U<*
!!!!!!UDQ:K'FC-D7$6<DD=>?R*,#)Q@88
!!9
9

Tuesday, July 20, 2010


Camel: consumer
!*"##!BC&')D(U+,!$+)$,-#!-$*',!40)5!&')D(U+,!.
!!-$2!+)F5'#)*Z,#!/!
!!!!jf+**CMI**5MEE0:0:0:0MccrrE$<U+6E*+D*j
!
!!-$2!,+$+#1+!/!.
!!!!!"#$!UDQM!B+DD<Q+!/2!
!!!!!!,+56C7j[+66'!qDj!>',U<*!
!!!!!!!!!!!!UDQ:K'FC-D7$6<DD=>?R*,#)Q@88
!!9
9

Tuesday, July 20, 2010


Camel: producer
!*"##!&'U+*^,'F($+,!
!!$+)$,-#!-$*',!40)5!^,'F($+,!.
!!
!!-$2!+)F5'#)*Z,#!/!
!!!!j$'U+*FMEE6'$<6I'D*Mc444E*+D*j
9

Tuesday, July 20, 2010


Camel: producer

1"*!5,'F($+,!/!<$*',=>?&'U+*^,'F($+,@:D*<,*

1"*!*#U+!/!j&(,,+)*!*#U+M!j!3!,$4!\<*+
5,'F($+,!O!*#U+

Tuesday, July 20, 2010


Akka Persistence

Tuesday, July 20, 2010


Akka Persistence API
EE!*,<)D<$*#')<6!&<DD<)F,<mK<$%+F!B<5!
1"*!U<5!/!&<DD<)F,<R*',<Q+:)+JB<5

EE!*,<)D<$*#')<6!A+F#DmK<$%+F!n+$*',!
1"*!1+$*',!/!A+F#DR*',<Q+:)+Jn+$*',

EE!*,<)D<$*#')<6!B')Q'mK<$%+F!A+>
1"*!,+>!/!B')Q'R*',<Q+:)+JA+>

Turns the STM into ACID


Tuesday, July 20, 2010
Get data by id
EE!*,<)D<$*#')<6!&<DD<)F,<mK<$%+F!B<5!
1"*!U<5!/!&<DD<)F,<R*',<Q+:Q+*B<57((#F8

EE!*,<)D<$*#')<6!A+F#DmK<$%+F!n+$*',!
1"*!1+$*',!/!A+F#DR*',<Q+:Q+*n+$*',7((#F8

EE!*,<)D<$*#')<6!B')Q'mK<$%+F!A+>
1"*!,+>!/!B')Q'R*',<Q+:Q+*A+>7((#F8

Tuesday, July 20, 2010


For Redis only (so far)

1"*!s(+(+M!^+,D#D*+)*`(+(+?S6+U+)*"C5+@!/!!!
!!A+F#DR*',<Q+:)+J`(+(+

1"*!D+*M%^+,D#D*+)*R',*+FR+*?S6+U+)*"C5+@!/
!!A+F#DR*',<Q+:)+JR',*+FR+*

Tuesday, July 20, 2010


Akka Deployment

Tuesday, July 20, 2010


Deployment
Deploy as dependency JAR in
WEB-INF/lib etc.
Run as microkernel
Soon OSGi-enabled, then drop
in any OSGi container (Spring
DM server, Karaf etc.)

Tuesday, July 20, 2010


...and much more

REST Security
Web
Comet AMQP
JTA Guice
Tuesday, July 20, 2010
Learn more
http://akkasource.org

Tuesday, July 20, 2010


EOF
Tuesday, July 20, 2010
?
Tuesday, July 20, 2010

Вам также может понравиться