Actor 能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息的发送、接收来实现高并发的,Actor 可以看作是一个个独立的实体,他们之间是毫无关联的。但是,他们可以通过消息来通信。一个 Actor 收到其他 Actor 的信息后,它可以根据需要作出各种相应。消息的类型可以是任意的,消息的内容也可以是任意的(Scala Actor 是 scala 2.10.x 版本及以前版本的 Actor。Scala 在 2.11.x 版本中将 Akka 加入其中,作为其默认的 Actor,老版本的 Actor 已经废弃)akka是以actor为模型的,学习actor是为了akka做准备。
Actor的执行顺序:
1)、首先调用 start()方法启动 Actor
2)、调用 start()方法后其 act()方法会被执行
3)、向 Actor 发送消息
4)、act 方法执行完成之后,程序会调用 exit 方法
akka
Spark 的 RPC 是通过 Akka 类库实现的,Akka 用 Scala 语言开发,基于 Actor并发模型实现,Akka 具有高可靠、高性能、可扩展等特点,使用 Akka 可以轻松实现分布式 RPC 功能
Akka 基于 Actor 模型,提供了一个用于构建可扩展的(Scalable)、弹性的(Resilient)、快速响应的(Responsive)应用程序的平台。Actor 模型:在计算机科学领域,Actor 模型是一个并行计算(ConcurrentComputation)模型,它把 actor 作为并行计算的基本元素来对待:为响应一个接收到的消息,一个 actor 能够自己做出一些决策,如创建更多的 actor,或发送更多的消息,或者确定如何去响应接收到的下一个消息。
1、当master与worker都启动后,worker首先会向master注册自己
2、master收到worker的注册信息后 会告诉自己已经注册成功
3、worker收到master的注册信息后,会定期向master汇报自己的状态,包括向master报告心跳信息
4、master收到worker的心跳信息后,定期的更新worker的状态,因为worker在发送心跳的时候会携带心跳发送的时间,master会监测worker发送过来的心跳时间和当前的时间差,如果大于五分钟,则认为worker已死,然后master在分配任务的时候就不会给worker进行发放任务
case class Messge(actor:Actor,msg:String)
class MyActor1 extends Actor {
def act(): Unit = {
while(true){
receive{
case message:Messge => {
if(message.msg.equals("hello")){
println("hello")
message.actor ! "hi~"
}else if(message.msg.equals("could we have a date?")){
println("could we have a date?")
message.actor ! "yes!"
}else if(message.msg.equals("ok ~")){
println("ok ~")
println("Let's go!")
}
}
case _=>{
println("default...")
}
}
}
}
}
class MyActor2(actor:Actor) extends Actor {
actor ! Messge(this,"hello")
def act(): Unit = {
while(true){
receive{
case s:String => {
if(s.equals("hi~")){
println("hi~")
actor ! Messge(this,"could we have a date?")
}else if(s.equals("yes!")){
println("yes!")
actor ! Messge(this,"ok ~")
}
}
case _=>{
println("default...")
}
}
}
}
}
object ActorExample {
def main(args: Array[String]): Unit = {
val actor1 = new MyActor1()
val actor2 = new MyActor2(actor1)
actor1.start()
actor2.start()
}
}