2014-09-26 62 views
2

我是新来的斯卡拉和阿卡,我一直在看阿卡书。对于我认为与演员共同使用的案例,我找不到合理的解决方案。积累和订购儿童演员的反应?

假设您有一位父母演员接收大量工作请求(假设您需要前往网络下载100个文件),因此父母演员将工作分解并将其路由到10儿童,以便我们一次下载超过1个文件。

不知何故,我需要将所有文件按照的顺序回到父代。这将是一个很好的设计模式吗?

I found a link在我的搜索中,他们似乎想出了一个完成此任务的好方法,但是因为博客没有真正展示如何使用该示例(因为他们只是提供了代码段)我不明白如何付诸实践: http://www.ccri.com/2014/01/22/accumulating-responses-from-child-actors-and-transitive-message-ordering/

回答

3

它可以用akka futures完成。从你的父母演员:

  1. 创建100个指数期货,每个取一个文件
  2. 使用Future.sequence.traverse期货的阵列映射到文件的数组
  3. 地图的未来的数组到.pipe到阵列发送回父演员

每个未来可能是一个ask儿童演员池的结果,如果获取每个文件是最适合的演员而不是未来。

+0

这可以通过用'.reduce'和'.andThen'替换第2步来改进,以便在每个任务完成时按顺序遍历数组,并且将结果(单个下载或错误)管回到父母演员,因为他们完成。因此,父母可以单独处理,并按顺序处理。稍后我会尝试获取片段.. – tariksbl 2014-09-26 19:57:23

+0

嗯,基本上所有文件都需要一次在一个地方。将每个文件单独发回给父母是不好的,除非我将它们保存在演员中,如果该演员正在接收多个请求,我不能这么做。 – spierce7 2014-09-26 19:59:57

+0

我提到的博客文章似乎提到使用问是一个不好的方法:“但是还有额外的好处,我认为人们可能更感兴趣的更普遍:我们已经删除了使用问题模式!而不是要求 - 它隐含地建立了自己的临时演员,从一般的写作方式来看,它会产生一定的性能损失 - 我们写自己的承诺并自己完成它,我们也知道临时演员什么时候可以关闭它,允许ActorContext干净地处理它。“ – spierce7 2014-09-26 20:01:28