Actor 是编写并行计算或分布式系统的高层次抽象(类似java中的Thread线程)
让程序员不必为多线程模式下为共享锁而烦恼
每个Actors有自己的世界观
当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget)
发送消息后不必等另外Actors回复,也不必暂停
每个Actors有自己的消息队列
进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统
Actor 相等于我们理解的线程,Thread
Spark底层节点之间的通信使用的Akka通信模式
Akka就是Actor实现的
Actor Model
-
ActorModel
是消息传递模型,基本特征就是消息传递 - 消息发送是异步的,非阻塞的
- 消息一旦发送成功,不能修改
-
Actor
之间传递时,自己决定去检查消息,而不是一直等待,是异步非阻塞的
1、Actor简单发送接收消息
Spark底层的通信模型
import scala.actors.Actor
class myActor extends Actor {
override def act(): Unit = {
receive {
case x:String => println("save String ="+ x)
case x:Int => println("save Int")
case _ => println("save default")
}
}
}
object Lesson_Actor {
def main(args: Array[String]): Unit = {
// 创建actor的消息接收和传递
val actor =new myActor()
// 启动
actor.start()
// 发送消息写法
actor ! "i love you !"
}
}
2、Actor与Actor之间的通信
case class Message(actor:Actor, msg:Any)
class Actor1 extends Actor {
def act() {
while(true) {
receive{
case msg :Message => {
println("i sava msg ! = "+ msg.msg)
msg.actor ! "i love you too !"
}
case msg :String => println(msg)
case _ => println("default msg!")
}
}
}
}
class Actor2(actor :Actor) extends Actor {
actor ! Message(this,"i love you !")
def act() {
while(true) {
receive {
case msg :String => {
if(msg.equals("i love you too !")) {
println(msg)
actor! "could we have a date !"
}
}
case _ => println("default msg!")
}
}
}
}
object Lesson_Actor2 {
def main(args: Array[String]): Unit = {
val actor1 = new Actor1()
actor1.start()
val actor2 = new Actor2(actor1)
actor2.start()
}
}
-
while(true){ }
一直处于接收消息的状态!不会运行1次就结束了!
什么是Akka
Akka 是用 Scala
编写的库,用于简化编写容错的、高可伸缩性的 Java 和Scala 的 Actor 模型应用,底层实现就是Actor,Akka
是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。
spark1.6版本之前,spark分布式节点之间的消息传递使用的就是Akka,底层也就是actor实现的。1.6之后使用的netty传输。