初识Akka
这两天微软的分布式系统开发框架rDSN开源出来了,必须要Akka压压惊,当然在
Spark
中大量的使用了AKKA
是主要原因^_^
AKKA介绍
Akka是一个基于JVM
的用于构建高并发、分布式、弹性的消息驱动系统,它有以下5个特点:
- 并发和分布式
- 弹性设计
- 高性能
- 去中心化
- 高扩展性
可以基于AKKA
构建高并发的web框架,也可以构建分布式系统(Spark
)
AKKA的引用
如果你是Maven
用户,你可以这么添加依赖1
2
3
4
5<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.10</artifactId>
<version>2.3.11</version>
</dependency>
如果你是SBT
用户,你的build.sbt
可以这么写1
name := "My Project"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies +=
"com.typesafe.akka" %% "akka-actor" % "2.3.11"
它还提供了好多其他的其他用法,但是由于天朝连国外网速也是在是太慢了,我直接去http://akka.io/downloads/将压缩包给download下来,然后将已编译的jar
添加到IDEA中,简单、粗暴、高效。
AKAA的使用
AKKA
是基于Scala
的Actor
来实现的,了解Scala
的Actor
可以参考我之前的一篇文章我眼中的Scala-简洁不简单。
在AKKA
中最重要的是ActorSystem
,关于ActorSystem
在Doc中有这么一句话:
Note: An ActorSystem is a heavyweight structure that will allocate 1…N Threads, so create one per logical application.
普通模式的调用
首先创建一个类GreetingActor
添加以下代码1
2
3
4
5
6
7
8
9
10
11import akka.actor._
case class Greeting(who:String)
/**
* Created by yanyl on 6/3/15.
*/
class GreetingActor extends Actor with ActorLogging {
def receive={
case Greeting(who)=>log.info("hello"+who);
}
}
这样就建立了一个标准的Actor
,用过receive
方法不断地监听,
然后建立一个Test
类向这个Actor
发送消息1
2
3
4
5
6
7
8
9
10
11
12
13import akka.actor._;
/**
* Created by yanyl on 6/2/15.
*/
object Test {
def main(args:Array[String]): Unit ={
val system=ActorSystem("mySystem");
val greeter=system.actorOf(Props[GreetingActor],name="greeter");
greeter!Greeting("tom")
println("i am not tom")
}
}
叹号!
表示发送非阻塞消息,执行之后你可以在控制台看到
i am not tom
[INFO] [06/05/2015 00:56:27.188] [mySystem-akka.actor.default-dispatcher-5] [akka://mySystem/user/greeter] hellotom
并可以发现这个程序并没有停止,这是因为Actor
一直在监听。