0

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

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

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

4

2 回答 2

1

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

更新

我认为这个问题在 Play 上!版本 1.x,因为Play 2.0 已经使用内部 Akka Actor 系统来处理请求处理

你应该已经知道

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

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

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

关于 java socket nio 的相关问题。

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

于 2012-10-19T06:02:04.670 回答
0

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

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

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

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

于 2013-11-29T11:31:29.967 回答