我有一个使用线程的第三方API。我正在使用Play Framework进行编码,并希望利用AKKA来实现ASYC功能并实现实时结果。但是我不确定是否将AKKA与使用线程的API集成是否有意义。考虑以下情况:
- 使用插座查询第三方API,使用股票符号返回股票价格
- 第三方接收消息,使用线程执行命令,并执行其他需要做的事情。我并不真正担心它如何做事。只是指出它利用线程。
- 第三方API开始吐出数据
- 返回的过程数据。如果数据匹配给定的用例,请将其保存在数据库中,然后将其推到浏览器中。
您能否分享Akka在此用例中可以创建价值的位置?谢谢一堆
akka设计用于异步处理。因此,只有在与第三方API的通信通过异步非阻滞io进行的情况下,这才适合。这将使您的应用程序与第三方方面的任何线程细节隔离。
update
我认为这个问题正在播放!版本1.x,作为Play 2.0的版本,已经使用了内部AKKA Actor系统来处理请求处理。
您应该已经知道
游戏旨在处理非常简短的请求。它使用固定的 线程池以处理HTTP连接器排队的处理请求。要得到 最佳结果,线程池应尽可能小。我们 通常使用处理器NB的最佳值 1设置 默认池大小。
因此,对于任何遥控(或任何潜在的持久)通信,您必须以异步的非阻滞方式直接进行或在单独的线程中执行它,以防止Play play的小线池耗尽。不管您的第三方API是否使用锁。
还要注意,Play对异步处理有一些内置支持。在这种情况下,可以使用它代替Akka。只需使用返回Future
的async插座io库,将其转换为 Promise
和 await()
。类似于在Play的Web服务客户端中完成的方式。
Java插座上的相关问题。
此外,我建议缓存获得的股票报价,以进一步提高性能。Guava Cache是一个很好的候选人。在刷新模式下,它也可以用于执行更新引号的定期背景请求。
在我的项目中,我经常必须处理阻止旧代码,数据库调用,旧的阻止网络通信等。在那些情况下,我将阻塞零件隔离并在单独的线程中执行。该线程由Akka Actor控制。
所以我得到的是对并发的完全控制。我只需要限制这些演员的数量。另一个胜利是能够停止阻止操作,如果处理中断。
最后,这是最重要的特征,我从Akka演员的失败竞争中获利。我能够轻松停止或重新启动子组件,重置外部资源等。
因此,Akka不仅是异步处理,而且对于容忍失败的系统尤其重要。