scala - Akka 中的 I/O 是如何工作的?

标签 scala scalability websocket actor akka

当您需要执行 I/O(即数据库操作)时,actor 模型(在 Akka 中)如何工作?

我的理解是阻塞操作会抛出异常(并且由于 Akka 使用的 Netty 的事件性质,基本上会破坏所有并发性)。因此我将不得不使用 Future或类似的东西 - 但是我不理解并发模型。

  • 1 个参与者可以同时处理多条消息吗?
  • 如果参与者在 future 中进行阻塞调用(即 future.get() )只阻止当前 actor 的执行;或者在阻塞调用完成之前它会阻止对所有参与者执行吗?
  • 如果它阻止所有执行,那么如何使用 future 的辅助并发(即,将来不会调用阻塞调用仍然相当于创建一个参与者并执行阻塞调用)?
  • 处理多阶段过程(即从数据库读取;调用阻塞 Web 服务;从数据库读取;写入数据库)的最佳方法是什么,其中每个步骤都依赖于最后一个?

  • 基本的上下文是这样的:
  • 我正在使用一个 Websocket 服务器,它将维护数千个 session 。
  • 每个 session 都有一些状态(即身份验证详细信息等);
  • Javascript 客户端将向服务器发送 JSON-RPC 消息,服务器将其传递给适当的 session 参与者,后者将执行它并返回结果。
  • RPC 调用的执行将涉及一些 I/O 和阻塞调用。
  • 将有大量并发请求(每个用户将通过 WebSocket 连接发出大量请求,并且会有很多用户)。

  • 有没有更好的方法来实现这一目标?

    最佳答案

    在 Akka 中,阻塞操作不会抛出异常。您可以阻止来自 Actor 的调用(您可能希望将其最小化,但那是另一回事)。

  • 不,1 个 Actor 实例不能。
  • 它不会阻止任何其他 Actor 。您可以通过使用特定的 Dispatcher 来影响这一点。 Futures 使用默认调度程序(通常是全局事件驱动的调度程序),因此它在池中的线​​程上运行。您可以选择要为 Actor 使用的调度程序(每个 Actor 或所有 Actor )。我想如果您真的想创建一个问题,您可以将完全相同的(基于线程的)调度程序传递给 future 和 Actor ,但这需要您的一些意图。我想如果你有大量的 future 无限期地阻塞并且 executorservice 已配置为固定数量的线程,你可能会炸毁 executorservice。所以很多'如果'。 f.get 仅在 Future 尚未完成时阻塞。它将阻塞您调用它的 Actor 的“当前线程”(如果您从 Actor 调用它,顺便说一下,这不是必需的)
  • 你不一定要阻止。您可以使用回调代替 f.get。你甚至可以在不阻塞的情况下编写 Futures。查看 Viktor 关于“akka 充满希望的 future ”的演讲以了解更多详细信息:http://skillsmatter.com/podcast/scala/talk-by-viktor-klang
  • 我会在步骤之间使用异步通信(如果这些步骤本身就是有意义的过程),所以每个步骤都使用一个参与者,其中每个参与者都向下一个参与者发送单向消息,也可能向其他一些不会的参与者发送单向消息可以监督进程的块。通过这种方式,您可以创建一系列actor,您可以在其中创建多个actor,在它前面放置一个负载平衡actor,这样如果一个actor 阻塞在一个链中,另一个相同类型的actor 可能不会在另一个链中。这也适用于您的“上下文”问题,将工作量传递给本地参与者,将它们链接到负载平衡参与者之后。

  • 至于 netty(我假设你的意思是远程 Actor ,因为这是 netty 在 Akka 中唯一使用的东西),如果你担心的话,尽快将你的工作传递给本地 Actor 或 future (带回调)关于定时或防止 netty 以某种方式完成它的工作。

    关于scala - Akka 中的 I/O 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528779/

    相关文章:

    java - 带 Eclipse 的 Google App Engine 上的 Scala

    Scala Intellij 断点被忽略

    php - 最适合照片共享网站的语言 : PHP, Python、Ruby 或其他语言?

    javascript - 我可以扩展我的 nodejs 应用程序的最佳方式是什么?

    javascript - WebSocket JS 的自定义 header

    IntelliJ 的 Scala 风格指南格式化程序

    scala - 我应该覆盖默认的 ExecutionContext 吗?

    c# - C#的高可用性和可伸缩性

    javascript - 2台服务器之间的Websockets?

    java - 如何在 Java Websocket 客户端中添加 header