我已经读过 Reactive Manifesto 几次,并试图围绕所有这些反应性、异步、非阻塞的东西。很清楚如何在 Actor 之上制作可扩展的系统,但是如果我会Future
在我的代码中积极使用 scala,那么在可扩展性和异步执行执行方面,我是否会得到相同的效果,每个方法都会接受或返回 Future。这样的服务是否具有可扩展性和响应性?可以说,在这个问题中,我对服务的事件驱动和弹性部分不太感兴趣。
user1078671
问问题
255 次
1 回答
8
这个答案反映了我在 Scala 及其Actor
和Future
类型中使用 Akka 的经验。我不认为自己是专家,但我已经使用这些库完成了一些系统,并且觉得我开始培养如何使用它们的感觉。
选择使用 Actor 还是 Future 取决于您需要的并发性的性质。期货以单子形式和 DAG 结构图组成,使得某些计算结构非常优雅地组成。但它们有严重的局限性。基本上,在 Future 中并发执行的计算必须是自包含的(或最多仅引用不可变的外部状态),否则您还没有解决线程间干扰问题以及所有伴随风险,例如死锁、竞争条件、不可预测的行为或数据结构损坏。
当您的计算涉及长寿命、可变状态时,Actor 会封装它以安全地防止损坏和竞争条件。另一方面,actor 是不可组合的,但它们确实为您如何构建交互计算网络提供了很大的灵活性。仅当您不将参与者响应限制为始终且仅将它们(对请求的响应)发送回从其接收请求的参与者时,这才是正确的。如果您只向发出请求的参与者发送响应,那么您将受限于参与者之间交互的树状结构模式。
在任何真实的、非平凡的系统中,您很可能同时使用两种形式,Future 和 Actor。
于 2013-10-04T15:54:24.637 回答