当前位置: 首页 > 科技观察

Akka使用系列之四:Future

时间:2023-03-12 18:07:17 科技观察

本文介绍了Akka的同步机制以及Spark与Akka的恩怨情仇。1、FutureAkka中的Actor默认异步收发消息。为了说明异步性,我们实现了以下数学老师和历史老师的Actor:classMathTeacherActorextendsActorwithActorLogging{defreceive={case"Whatis1+1equalto?"=>{Thread.sleep(1)sender!"1+1等于2"}}}classHistoryTeacherActorextendsActorwithActorLogging{defreceive={case"历史上最大的众筹动作是什么?"=>{Thread.sleep(1)sender!"历史上最大的众筹动作是+1s"}}}如果我们在询问历史老师后访问答案(如下代码所示),我们发现我们无法获得正确答案。原因是Akka是异步非阻塞的。valres=历史老师?“历史上最大的众筹活动是什么?”println(res)本质上是历史老师?“历史上最大的众筹活动是什么?”根本不返回答案,而是Future。在Akka中,Future是一种数据结构,用于获取某些并发操作的结果。使用Future,我们可以同步(阻塞)或异步(非阻塞)访问结果。下面是一个简单地以同步(阻塞)方式访问结果的示例。classStudentActor(mathteacher:ActorRef,historyteacher:ActorRef)extendsActorwithActorLogging{defreceive={caseres:String=>{valfuture1=historyteacher?"历史上最大的众筹活动是什么?"valfuture2=mathteacher?"1+1等于多少?valres1=Await.result(future1,10second)valres2=Await.result(future2,10second)println(res1)println(res2)}}}2.Akka和SparkSpark最初使用Akka作为内部通信组件。在Spark1.3时代,为了解决大块数据(如Shuffle)的传输问题,Spark引入了Netty通信框架。从Spark1.6开始,Spark可以配置使用Akka或者Netty,也就是说Netty可以完全替代Akka。然后到了Spark2,Spark已经彻底抛弃了Akka,全部使用Netty。伤心。为什么Spark会无情地、有预谋地抛弃Akka?Spark官方给出了解释:https://issues.apache.org/jira/browse/SPARK-5293。许多Spark用户应用程序正在使用(或想要使用)Akka。Akka作为一个整体可以提供极好的架构简单性和统一性。但是,由于Spark依赖于Akka,因此用户不可能依赖不同的版本,过去我们收到了很多关于这个特定问题的请求。例如,SparkStreaming可能用作Akka消息的接收者——但我们对Akka的依赖要求上游Akkaactor也使用相同版本的Akka。由于我们对Akka的使用是有限的(主要用于RPC和单线程事件循环),我们可以用替代的RPC实现和Spark中的通用事件循环来替换它。大意是很多Spark用户希望同时使用Spark和Akka,但是必须使用Spark所依赖的Akka版本。Spark主要使用Akka的RPC和单线程event-loop,所以Spark不需要完全依赖Akka。最后,对Akka念念不忘的Spark用netty实现了一个简单版的Akka。爱它。3.总结到这里,Akka用法系列就结束了。本系列简要介绍了Akka的基础知识并介绍了它的大纲。【本文为专栏作家“李莉”原创稿件,转载请联系授权】点此查看该作者更多好文