Akka介绍

刚刚看完DCI架构,个人总结从事件模式角度可以很好实现DCI,结果从Akka上得到验证。

Akka有几个特性:
1.更加简单的并发策略Simpler Concurrency,通过Actors STM & Transactors能够简化编写可靠的并行计算。
2.EDA架构Event-driven Architecture,完美的异步事件驱动架构,不会堵塞。
3.真正的可伸缩性,使用异步消息在多核以及多个节点之间扩展。
4.容错性,重视失败。
5.远程透明性

Introducing Akka – Simpler Scalability, Fault-Tolerance, Concurrency & Remoting Through Actors一文对Akka进行了详细介绍。

Actor Model是用来编写并行计算或分布式系统的高层次抽象,让程序员不必为多线程模式下共享锁而烦恼,被用在Erlang 语言上,高可用性99.9999999 % 一年只有31 ms当机。

Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的世界观,当需要和其他Actors交互时,通过发送事件和消息(看到Domain Events影子 呵呵),发送是异步的,非堵塞的(fire-and-forget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。

Akka有Scala API和Java API,Scala使用方式如下:


class MyActor extends Actor {
def receive = {
case "test" => println("received test")
case _ => println(
"received unknown message")
}
}

val myActor = new MyActor
myActor.start
myActor !
"test" //!表示发送消息

Actors非常轻量,大约600字节,这样4 G RAM可以容纳6.5 百万个Actors。

该文后面介绍了Akka的消息系统,个人感觉和JMS非常类似,如果你了解JMS,很容易理解,除此以外介绍了Scala的trait ,一种类似AOP的静态混合器Mixin。


[该贴被admin于2011-05-16 09:03修改过]

继续大意翻译:
Akka的STM 和 Transactors模型

Actors 能够非常好解决性能问题,但是如果使用多线程状态共享机制去实现就非常糟糕,这就必须使用Software Transactional Memory 软件交易内存STM。

当你需要实现一个组合式的事务模型时,使用STM比较好,Akka的STM实现来自于 Clojure语言(把Scala和 Clojure结合起来了).

Akka允许你将Actors和STM结合起来,用Transactors 表达,你并不是一直都需要Transactors ,但是当你需要时,才使用它(和JTA类似),STM (组合式事务共享状态compositional transactional shared state) 提供事务性的, 组合的, 异步的, 基于事件的消息流程。

Akka提供三个事务抽象‘Map’, ‘Vector’ and ‘Ref’,你可以使用它们在Actors之间共享状态。当然,你不能在Transactors以外修改这些Actors,否则就报错(感觉是上了一把锁)

STM给你类似数据库ACID的ACI:‘Atomicity’, ‘Consistency’ and ‘Isolation’. 代表D的‘Durability’则因为是内存,无法实现,是持久化的事情。

Akka的持久化可以使用key-value存储,如Cassandra MongoDB Redis。

个人嘀咕:除了STM模型以外,Akka原理和我们倡导基于异步Domain Events + JMS架构差不多,当然Akka更简洁一些:

博主,能否介绍一下Akka与Scala有哪些具体的区别么?

2010年01月08日 20:40 "chinmole"的内容
Akka与Scala有哪些具体的区别么

基于Scala的API或者称为Scala框架。
当然,也提供Java框架,可以与Spring Guice整合。

这才是scala嘛,lift web framework让我有点失望

楼主您好,在Towards Better Concurrency50页中提到了actor无法很好工作的几个场景:
Shared state is needed F.e. bank account
Need to achieve global consensus
Synchronous behavior is required
不知道您对这些场景有什么好的解决方法,类似于事件驱动模型应该也会遇到同样的问题吧?

2010年02月23日 21:59 "lurga"的内容
不知道您对这些场景有什么好的解决方法,类似于事件驱动模型应该也会遇到同样的问题吧

这几个情况是指业务如果100%需要数据共享模型,而不是Actor模型(这是一种非数据共享模型)。

当然我们可以把这种共享业务切分为Actor模型,但是可能有些情况不不能切分,就像面向对象的切分方法也有失效时候。

个人认为这是一种对新技术的谦虚做法,因为没有在所有场合大规模推广应用实践,所以留一个伏笔吧。

我做了一个希望能远程调用actor的例子,但是akka的配置文件放在哪呢?总是报错找不到配置文件,application.conf

不知道Scott007有没解决那个问题。我现在做远程调用,也是报找不到配置文件,不知道把这个文件放在哪。希望哪位大侠也能回答下,感谢!

只需将application.conf配置文件放在src下即可。

放么classpath下面就可以了