【问题标题】:Node.js programming style with Akka使用 Akka 的 Node.js 编程风格
【发布时间】:2026-02-04 09:00:02
【问题描述】:

我从 node.js 的角度来了解 Akka。我在下面做了以下node.js代码,很容易编写和遵循。我可以轻松扩展以异步处理和聚合多个服务,同时保留初始参数状态数据(例如a)。

function handleAction(a, b, callback) {
    remoteServiceOperation(b, function(err, data) {
        if (!err) {
            // I can reference argument a
            z = a + data; // Do work with a and service result
        }
    });
}

下面是 Akka/Scala 的粗略伪代码。我的理解是问? 块,一般应该避免。试图说明我的知识培训在哪里结束,以及我如何不清楚如何保持状态a、聚合(未显示),或者可能以一般的 node.js 样式构建 Akka。

receive {
    case handleAction(a) =>
        remoteService ! new RemoteServiceOperation(b, c)
        // About to leave and we'll loose `a`
    case remoteServiceOperationResponse(data) =>
        // `a` is afk
}

如何写出更像节点的 Akka?

【问题讨论】:

  • ? 不是阻塞操作。我想你可能对接收函数的工作方式感到困惑——它只是 Scala 模式匹配,写 case handleAction(a) 并不会真正调用名为 handleAction 的函数。
  • 谢谢,Akka Futures 澄清了您对阻塞的看法。使用? 似乎不是唯一的出路。

标签: functional-programming closures akka


【解决方案1】:

我猜你在 nodejs 中的回调众所周知的编程风格比使用 Actors 更好地映射了Futures。

看起来像这样:

val service1Res: Future[Int] = service1()
val service2Res: Future[Int] = service2()

for {
  i <- service1Res
  j <- service2Res
} yield i+j + 2

很多人说,演员最适合用来控制此类事情的状态和未来。使用 Actor 对所有内容进行建模时会遇到的问题是您需要定义大量消息来与这些 Actor 进行通信。

如果您确实需要或想要在收到handleAction 消息时使用actors,则生成一个新的actor,它将完成工作并在c-tor 中获得a。这样做的额外好处是,您将很好地监督可能是 akka 最少使用但同时最有价值的选项。

【讨论】: