我有一个使用线程的第三方API。我正在使用Play框架进行编码,并希望利用Akka来实现ASYC功能并实现实时结果。但我不确定将Akka与使用Threads的API集成是否有意义。请考虑以下情形:
请问你能分享Akka在这个用例中可以创造价值的地方吗?非常感谢
答案 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
,将其转换为Promise
和await()
即可。与在Play的Web Service client中完成的方式类似。
相关question on java socket nio。
此外,我建议缓存获得的股票报价,以进一步提高业绩。 Guava Cache是一个很好的候选人。在刷新模式下,即使使用同步API,它也可用于对更新的引号执行定期后台请求。
答案 1 :(得分:0)
在我的项目中,我经常需要处理阻止遗留代码,数据库调用,旧阻塞网络通信等问题。 在这些情况下,我隔离阻塞部分并在单独的线程中执行它。 该线程由AKKA演员控制。
所以我得到的是对并发的完全控制。 我只需要限制那些演员的数量。 另一个胜利是能够阻止阻塞操作,如果它处理中断。
最后,这是最重要的特征,我从AKKA演员的失败容忍中获利。我能够轻松地停止或重启子组件,重置外部资源等。
因此,Akka不仅涉及异步处理,而且对于容错系统尤其重要。