可扩展的实时事务处理
我们相信编写出正确的具有容错性和可扩展性的并发程序太困难了。这多数是因为我们使用了错误的工具和错误的抽象级别。Akka就是为了改变这种状况而生的。通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台。在容错性方面我们采取了“let it crash”(让它崩溃)模型,人们已经将这种模型用在了电信行业,构建出“自愈合”的应用和永不停机的系统,取得了巨大成功。Actor还为透明的分布式系统以及真正的可扩展高容错应用的基础进行了抽象。
Akka是开源的,可以通过Apache 2许可获得。
从 http://akka.io/downloads/ 下载
Akka实现了独特的混合模型
Actors
Actors为你提供:
对并发/并行程序的简单的、高级别的抽象。
异步、非阻塞、高性能的事件驱动编程模型。
非常轻量的事件驱动处理(1G内存可容纳约270万个actors)。
参阅 Actors (Scala) 和 Actors (Java)
容错性
使用“let-it-crash”语义和监管者树形结构来实现容错。非常适合编写永不停机、自愈合的高容错系统。监管者树形结构可以跨多个JVM来提供真正的高容错系统。
参阅 容错性 (Scala) 和 容错性 (Java)
位置透明性
Akka的所有元素都为分布式环境而设计:所有actor都仅通过发送消息进行互操作,所有操作都是异步的。
了解远程调用请参阅 事务透明性
事务性actors
事务性Actor是actor与STM(Software Transactional Memory)的组合。它使你能够使用自动重试和回滚来组合出原子消息流。
参阅 事务性actor (Scala) 和 事务性actor (Java)
Scala 和 Java APIs
Akka同时提供 Scala API 和 Java API.
Akka可以以两种不同的方式来使用
以库的形式:在web应用中使用,放到 WEB-INF/lib 中或者作为一个普通的Jar包放进classpath。
以微内核的形式:你可以将应用放进一个独立的内核。
参阅 用例与部署场景 了解细节。
Cloudy Akka 如何了?
Akka的商业支持早先被叫作Cloudy Akka. 它包括两部分:
Akka的集群支持
监控和管理(早先称为Atmos)
Cloudy Akka已经停止了。集群支持已经被移进了Akka的开源版本中(即将到来的Akka 2.1),而监控和管理(Atmos)现在被重新命名为Typesafe控制台,是Typesafe Stack(详见下文)商业合约的一部分。
Typesafe Stack
Akka现在是 Typesafe Stack 的一部分。
Typesafe stack是一个让开发者更容易地构建可扩展软件应用的现代软件平台。它在一个简单的包里组合了Scala语言、Akka、Play! Web框架和其它鲁棒的开发工具,能够与现有的Java基础设施无缝集成。
Typesafe Stack是完全开源的。
Typesafe控制台
在Typesafe Stack的顶端,我们还有名叫Typesafe控制台的商业产品,提供以下功能:
漂亮的Web界面,实时展示系统内部状态
通过Dashboard、JMX和REST进行管理
组件间及远程节点间消息的跟踪
实时统计
开销非常小的监控程序(生产系统中应该保持运行)
单节点上统计与日志信息的合并
统计数据的存储,以备后续处理
安装升级及滚动升级
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.actor.ActorRef;
public class HelloWorld extends UntypedActor {
@Override
public void preStart() {
final ActorRef greeter =
getContext().actorOf(Props.create(Greeter.class), "greeter");
greeter.tell(Greeter.Msg.GREET, getSelf());
}
@Override
public void onReceive(Object msg) {
if (msg == Greeter.Msg.DONE) {
getContext().stop(getSelf());
} else {
unhandled(msg);
}
}
}
这个HelloWorld继承了UntypedActor,表明我们实现的是一个Actor。
其中的preStart是在启动这个Actor时调用的方法。在这里,我们创建了另一个Actor的实例。我们稍后会看到另一个Actor Greeter的实现。然后,我们调用tell方法给它发了一个消息,Greeter.Msg.GREET,后面的getSelf()给出了一个Actor的引用(ActorRef),用以表示发消息的Actor。这只是启动一个Actor,后面的部分才是更重要的。
onReceive方法是处理我们接收到消息的情况。这里我们看到,如果接收到的消息是一个Greeter.Msg.DONE,我们就会停下(stop)所有的处理,同样,getSelf()指明停下的目标,否则的话,就说我们没处理(unhandled)。
另一个Actor:
import akka.actor.UntypedActor;
public class Greeter extends UntypedActor {
public static enum Msg {
GREET, DONE
}
@Override
public void onReceive(Object msg) {
if (msg == Msg.GREET) {
System.out.println("Hello World!");
getSender().tell(Msg.DONE, getSelf());
} else {
unhandled(msg);
}
}
}
(Greeter.java)