【问题标题】:Call thread based API from Actor Model framework like AKKA从像 AKKA 这样的 Actor Model 框架调用基于线程的 API
【发布时间】:2012-10-19 03:19:45
【问题描述】:

我有一个使用线程的第 3 方 API。我正在使用 Play 框架进行编码,并希望利用 Akka 来实现 ASYC 功能并实现实时结果。但我不确定将 Akka 与使用 Threads 的 API 集成是否有意义。考虑以下场景:

  1. 使用 Socket 查询 3rd 方 API 以使用股票代码返回股票价格
  2. 第 3 方接收消息,使用线程执行命令并执行它需要执行的任何其他操作。我并不真正担心它是如何做事的。只是指出它使用线程。
  3. 第 3 方 API 开始输出数据
  4. 返回处理数据。如果数据与给定的用例匹配,则将其保存在数据库中并将其推送到浏览器。

您能否分享一下 Akka 在这个用例中可以在哪里创造价值?非常感谢

【问题讨论】:

    标签: java sockets playframework socket.io akka


    【解决方案1】:

    Akka 专为异步处理而设计。 因此,只有通过异步非阻塞 IO 完成与 3rd 方 API 的通信时才适用。这会将您的应用程序与第 3 方的任何线程细节隔离开来。

    更新

    我认为这个问题在 Play 上!版本 1.x,为 Play 2.0 already uses an internal Akka Actor system to handle request processing

    你应该已经know那个

    Play 旨在处理非常短的请求。它使用固定的 线程池来处理由 HTTP 连接器排队的请求。要得到 最佳结果,线程池应尽可能小。我们 通常使用处理器的 nb + 1 的最佳值来设置 默认池大小。

    因此,对于任何远程(或任何可能持久的)通信,您必须以异步non-blocking 方式正确执行,或者在单独的线程中执行,以防止 play 的微小线程池在负载下耗尽。无论您的 3rd 方 API 是否使用锁。

    另请注意,Play 有一些内置的 support for async processing。在这种情况下,它可能是used instead of akka。只需使用返回Future 的异步套接字io 库,将其转换为Promiseawait()。类似于 Play 的 Web Service client 中的处理方式。

    相关question on java socket nio

    另外,我建议缓存获得的股票报价以进一步提高性能。 Guava Cache 是一个不错的候选人。在刷新模式下,即使使用同步 API,它也可用于执行定期后台请求以更新报价。

    【讨论】:

    • 您能否详细说明一下。第 3 方 API 不使用锁。所以,它不会阻塞线程。
    【解决方案2】:

    在我的项目中,我经常需要处理阻塞遗留代码、数据库调用、旧阻塞网络通信等问题。 在这些情况下,我隔离阻塞部分并在单独的线程中执行它。 此线程由 AKKA actor 控制。

    所以我得到的是对并发的完全控制。 我只需要限制这些演员的数量。 另一个好处是能够停止阻塞操作,如果它处理中断。

    最后,这是最重要的特点,我受益于 AKKA 演员的容错能力。我能够轻松停止或重新启动子组件、重置外部资源等。

    因此,Akka 不仅涉及异步处理,而且对于容错系统尤其重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多