【发布时间】:2014-11-05 17:06:28
【问题描述】:
给定以下函数对象,
val f : Int => Double = (i:Int) => i + 0.1
val g1 : Double => Double = (x:Double) => x*10
val g2 : Double => Double = (x:Double) => x/10
val h : (Double,Double) => Double = (x:Double,y:Double) => x+y
例如3个远程服务器或节点(IP xxx.xxx.xxx.1、IP 2和IP 3),如何分配这个程序的执行,
val fx = f(1)
val g1x = g1( fx )
val g2x = g2( fx )
val res = h ( g1x, g2x )
这样
-
fx在 IP 1 中计算, -
g1x在 IP 2 中计算, -
g2x在 IP 3 中计算, -
res在 IP 1 中计算
Scala Akka 或 Apache Spark 可以提供一个简单的方法来解决这个问题吗?
更新
- @pkinsky 建议的 RPC(远程过程调用)Finagle 可能是一个可行的选择。
- 将负载平衡策略视为一种选择执行节点的机制,至少任何可用的免费节点策略。
【问题讨论】:
-
问题,你为什么使用函数 vals 而不是 defs?
-
@ElectricCoffee 没有什么特别的原因,这个问题可以很好地说明方法,如果它导致一个好的解决方案真的是一个选择:)
-
你想序列化你的函数,将它们发送到远程服务器,让远程服务器执行它们,序列化结果,然后返回给你吗?还是您只需要一个 RPC 库?如果是第二个,请查看 twitter 的开源 Finagle 库。
-
@pkinsky 非常感谢您的想法,这很新颖,不确定每个选项的质量...
-
@enzyme 你几乎肯定想要第二个选项。查看 twitter 的主题介绍和分步分布式搜索引擎项目。 twitter.github.io/scala_school/finagle.htmltwitter.github.io/scala_school/searchbird.html
标签: scala akka rpc apache-spark finagle