一、Akka簡介 Akka時spark的底層通信框架,Hadoop的底層通信框架時rpc。 併發的程式編寫很難,但是Akka解決了spark的這個問題。 Akka構建在JVM平臺上,是一種高併發、分散式、並且容錯的應用工具包; Akka使用Scala語言編寫,同時它提供了Scala和Java的開發接 ...
一、Akka簡介
Akka時spark的底層通信框架,Hadoop的底層通信框架時rpc。
併發的程式編寫很難,但是Akka解決了spark的這個問題。
Akka構建在JVM平臺上,是一種高併發、分散式、並且容錯的應用工具包;
Akka使用Scala語言編寫,同時它提供了Scala和Java的開發介面,Akka可以開發一些高併發的程式。
二、Akka的Acor模型
A卡卡處理併發的方法基於actor模型,在基於actor的系統中,所有事物都是actor(類似於Java的萬物皆對象);
actor是一個併發模型設計的架構,而面對對象不屬於結構,它是一門思想;
如上如,actor與actor直接只能通過消息通信,
當一個actor給另一個actor發送消息時,只需要將消息發送給actor對應的代理(emailBox)即可,
而actor怎麼處理消息是我們自己定義的。
三、Akka特點
1.對併發模型進行了更高的抽象;
2.它是非同步、非阻塞、高性能的事件驅動編程模型;
3.它是一個輕量級的時間編程模型(1GB記憶體可以容納百萬級別的Actor)
4.actor簡化了併發編程,提高了程式的性能
四、Akka編程
1.需求1:我對自己發送消息,並處理消息
//創建CallMe類繼承Actor,它包含了對消息處理的業務邏輯 class CallMe extends Actor{ //重寫recevie方法,負責接收和處理消息 override def receive: Receive = { case "Hunter is cool" => println("You are Right") case "Hunter is ugly" => println("You are wrong") case "stop" => { //關閉代理ActorRef context.stop(self) //關閉ActorSystem context.system.terminate() } } } object CallMe { //1.創建ActorSystem對象 private val acFactory = ActorSystem("AcFactory") //2.調用ActorSystem對象的ActorOf方法,創建代理callRef private val callRef = acFactory.actorOf(Props[CallMe],"CallMe") def main(args: Array[String]): Unit = { //3.發送消息, !代表發送的意思 callRef ! "Hunter is cool" callRef ! "Hunter is ugly" callRef ! "stop" } }
2.需求2:男孩和女孩的對話模擬
class BoyActor(val b:ActorRef) extends Actor{ override def receive: Receive = { case "你好,mm" => { b ! "你好,mm" } case "你好,gg" => { println("你好,gg") b ! "我能約你吃飯麽?" } case "叔叔,我們不約!" =>{ println("叔叔,我們不約!") context.stop(self) context.system.terminate() } } } class GirlActor(val g:ActorRef) extends Actor{ override def receive: Receive = { case "你好,mm" =>{ println("你好,mm") g ! "你好,gg" } case "我能約你吃飯麽?" =>{ println("我能約你吃飯麽?") g ! "叔叔,我們不約!" } } } object WeChat { private val weChat = ActorSystem("WeChat") private val boyRef: ActorRef = weChat.actorOf(Props(new BoyActor(girlRef)),"Boy") private val girlRef: ActorRef = weChat.actorOf(Props(new GirlActor(boyRef)),"Girl") def main(args: Array[String]): Unit = { boyRef ! "你好,mm" } }
運行結果: