Akka 使用系列之四: Future

这篇文章介绍 Akka 的同步机制,以及 Spark 和 Akka 的恩怨情仇。

1 Akka 中的 Future

Akka 中的 Actor 发送和接收消息默认都是异步的。为了说明异步性,我们实行下面的数学老师和历史老师的 Actor:

class MathTeacherActor extends Actor with ActorLogging {
  def receive = {
    case "1+1等于多少?"           => {
      Thread.sleep(1)
      sender ! "1+1等于2"
    }
  }
}

class HistoryTeacherActor extends Actor with ActorLogging {
  def receive = {
    case "历史上规模最大的众筹行动是什么?" => {
      Thread.sleep(1)
      sender ! "历史上规模最大的众筹行动是 +1s"
    }
  }
}

如果我们在询问历史老师之后访问答案(如下面代码所示),我们发现并不能获取正确答案。原因就在于 Akka 是异步非阻塞的。

val res = historyteacher ? "历史上规模最大的众筹行动是什么?"
println(res)

实质上, historyteacher ? “历史上规模最大的众筹行动是什么?” 返回的根本不是答案,而是一个 Future。在Akka中, 一个Future是用来获取某个并发操作的结果的数据结构。有了 Future,我们可以以同步(阻塞)或异步(非阻塞)的方式访问结果。下面是简单地以同步(阻塞)方式访问结果的示例。

class StudentActor(mathteacher:ActorRef,historyteacher:ActorRef) 
extends Actor with ActorLogging{

  def receive = {
    case res:String => {
        val future1 = historyteacher ? "历史上规模最大的众筹行动是什么?"
        val future2 = mathteacher ? "1+1等于多少?"

        val res1    = Await.result(future1,10 second)
        val res2    = Await.result(future2,10 second)

        println(res1)
        println(res2)

    }
  }
}

2 Akka 和 Spark

Spark 一开始使用 Akka 作为内部通信部件。在 Spark 1.3 年代,为了解决大块数据(如Shuffle)的传输问题,Spark引入了Netty通信框架。到了 Spark 1.6, Spark 可以配置使用 Akka 或者 Netty 了,这意味着 Netty 可以完全替代 Akka 了。再到 Spark 2, Spark 已经完全抛弃 Akka 了,全部使用 Netty 了。Sad。

为什么 Spark 无情地有步骤有预谋地抛弃 Akka 呢?Spark 官方倒是给了一个说法:https://issues.apache.org/jira/browse/SPARK-5293

A lot of Spark user applications are using (or want to use) Akka. Akka as a whole can contribute great architectural simplicity and uniformity. However, because Spark depends on Akka, it is not possible for users to rely on different versions, and we have received many requests in the past asking for help about this specific issue. For example, Spark Streaming might be used as the receiver of Akka messages – but our dependency on Akka requires the upstream Akka actors to also use the identical version of Akka. Since our usage of Akka is limited (mainly for RPC and single-threaded event loop), we can replace it with alternative RPC implementations and a common event loop in Spark.

大意就是很多 Spark 用户在使用 Spark 之后,就必须使用 Spark 依赖的那个版本的 Akka。Spark 主要用了 Akka 的 RPC 和 单线程 event-loop,因此 Spark 没有必要依赖完全的 Akka。最终 Spark 用 netty 实现下简易版本的 Akka。真爱啊。

3 总结

到这里,Akka 使用系列就结束了。这个系列简单地过了一下 Akka 的基础知识,介绍其梗概。如果需要深入了解,还需要详细阅读官方文档。完整代码已经上传至 Github

最近在 GitHub 上开发了一个 Side Project – RoomAI。这个 Side Project 目标是提供一些非完整信息游戏环境,让算法人员开发非完整信息游戏 AI, 目前已经支持德州和梭哈。欢迎大家使用和反馈。我后续会基于这个项目写一些文章介绍非完整信息游戏的算法。

Akka 系列系列文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Oculus + Node.js + Three.js 打造VR世界

Oculus Rift 是一款为电子游戏设计的头戴式显示器。这是一款虚拟现实设备。这款设备很可能改变未来人们游戏的方式。 周五Hackday Showcase的...

4478
来自专栏施炯的IoT开发专栏

Windows Phone 7 数字罗盘使用指南

1. 什么是数字罗盘,和指南针有什么关系?     指南针是我们外出旅游时,用来指示方向的一种工具。常见的机械式指南针,它是一种根据地球磁场的有极性制作的地磁指...

18510
来自专栏算法+

MP3 编码解码 附完整c代码

图像方面,已经有stb_image,spot,freeimage等编解码库系列,做得特别赞。

1114
来自专栏针针小站

【System】Windows 10 RS4 1803 春季创意者镜像分享

1583
来自专栏工科狗和生物喵

C++初入门,写个弱智银行卡系统

写在前面: 自从课程设计之后,我们就开始了生产实习,我们老师找的是河南卫华集团的技术部实习,经过一阵子的不适应(比如说河南这边的基本没味道的伙食,我们现在两个人...

45411
来自专栏大数据挖掘DT机器学习

Python爬取链家网数据:新房楼盘价格分析

本文将详细讲解利用python爬虫收集了链家网800多条公开数据并作简单分析。数据真实性有待考查,本文仅作为数据分析入门者参考。 安装环境 Window 10 ...

3925
来自专栏FreeBuf

百足之虫死而不僵:Auto456家族木马的死灰复燃

作者 tianjiyun 就在今年上半年,456游戏大厅还是金钱的代名词。一个看起来并不起眼的游戏平台,注册用户却达2000余万,每天获利最高可达100余万。这...

2037
来自专栏Jerry的SAP技术分享

我用ABAP做过的那些无聊的事情

Jerry的成都同事李贝宁(Li Ben), 《SAP成都研究院李三郎:SCP Application Router简介》的作者,有一次11月份的时候和Jerr...

1362
来自专栏数据小魔方

使用Python中的folium包创建热力密度图

最近探索出来一个在Python中创建热力图非常高效的方法,使用folium包来创建热力图,实际效果非常赞,过程简单,代码量少。

2392
来自专栏无原型不设计

优秀原型设计欣赏:美食类App原型制作-Kitchen Stories

题材有Mockplus(摹客)团队提供,仅供参考学习。

2017

扫码关注云+社区