Spark

Scala的Actor模型

2018-12-10  本文已影响57人  geekAppke
Actor 是编写并行计算或分布式系统的高层次抽象(类似java中的Thread线程)
让程序员不必为多线程模式下为共享锁而烦恼

每个Actors有自己的世界观
当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget)
发送消息后不必等另外Actors回复,也不必暂停

每个Actors有自己的消息队列
进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统

Actor 相等于我们理解的线程,Thread
Spark底层节点之间的通信使用的Akka通信模式
Akka就是Actor实现的

Actor Model

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()
  }
}

什么是Akka

Akka 是用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和Scala 的 Actor 模型应用,底层实现就是Actor,Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。
spark1.6版本之前,spark分布式节点之间的消息传递使用的就是Akka,底层也就是actor实现的。1.6之后使用的netty传输。

Scala学习笔记导航

上一篇 下一篇

猜你喜欢

热点阅读