从Actor Model框架调用基于线程的API,如AKKA

时间:2012-10-19 03:19:45

标签: java sockets playframework socket.io akka

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

  1. 使用套接字查询第三方API,使用股票代码
  2. 返回股票价格
  3. 第三方接收消息,使用线程执行命令并执行其他任何需要执行的操作。我并不担心它是如何做到的。只是指出它利用线程。
  4. 第三方API开始吐出数据
  5. 返回流程数据。如果数据与给定的用例匹配,请将其保存在数据库中并将其推送到浏览器。
  6. 请问你能分享Akka在这个用例中可以创造价值的地方吗?非常感谢

2 个答案:

答案 0 :(得分:1)

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

<强>更新

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

你应该know那个

  

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

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

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

相关question on java socket nio

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

答案 1 :(得分:0)

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

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

最后,这是最重要的特征,我从AKKA演员的失败容忍中获利。我能够轻松地停止或重启子组件,重置外部资源等。

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