从Akka等演员模型框架中调用基于线程的API



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

  1. 使用插座查询第三方API,使用股票符号返回股票价格
  2. 第三方接收消息,使用线程执行命令,并执行其他需要做的事情。我并不真正担心它如何做事。只是指出它利用线程。
  3. 第三方API开始吐出数据
  4. 返回的过程数据。如果数据匹配给定的用例,请将其保存在数据库中,然后将其推到浏览器中。

您能否分享Akka在此用例中可以创建价值的位置?谢谢一堆

akka设计用于异步处理。因此,只有在与第三方API的通信通过异步非阻滞io进行的情况下,这才适合。这将使您的应用程序与第三方方面的任何线程细节隔离。

update

我认为这个问题正在播放!版本1.x,作为Play 2.0的版本,已经使用了内部AKKA Actor系统来处理请求处理。

您应该已经知道

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

因此,对于任何遥控(或任何潜在的持久)通信,您必须以异步的非阻滞方式直接进行或在单独的线程中执行它,以防止Play play的小线池耗尽。不管您的第三方API是否使用锁。

还要注意,Play对异步处理有一些内置支持。在这种情况下,可以使用它代替Akka。只需使用返回Future的async插座io库,将其转换为 Promiseawait()。类似于在Play的Web服务客户端中完成的方式。

Java插座上的相关问题。

此外,我建议缓存获得的股票报价,以进一步提高性能。Guava Cache是一个很好的候选人。在刷新模式下,它也可以用于执行更新引号的定期背景请求。

在我的项目中,我经常必须处理阻止旧代码,数据库调用,旧的阻止网络通信等。在那些情况下,我将阻塞零件隔离并在单独的线程中执行。该线程由Akka Actor控制。

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

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

因此,Akka不仅是异步处理,而且对于容忍失败的系统尤其重要。

最新更新