5

我的 Java Play2 应用程序正在调用一些外部 Web 服务以通过同步的 3rd 方客户端库获取数据。对于这个应用程序,我需要高流量和可扩展性。

播放文档说:

您的代码可能会阻塞的情况包括: 通过第三方客户端库使用 REST/WebService API (即,不使用 Play 的异步 WS API)[...]

请注意,您可能会因此将阻塞代码包装在 Futures 中。这并不意味着它是非阻塞的,它只是意味着阻塞将发生在不同的线程中[...]

相反,以下类型的 IO 不会阻塞: Play WS API,...

在 Play2 Java 应用程序中,使用 Promise 使事情异步并不是很有用,因为默认播放池用于 Futur 任务。结果,使用大量 Futur 将导致与仅使用具有大型默认线程池的同步调用相同的结果:同一池中的线程数大致相同。

所以我的问题是:

  • Java API 中的 play.libs.WS API 真的是异步的(不阻塞播放默认池中的任何线程)吗?
  • 如果我想要高流量和可扩展性,我应该总是使用它而不是我的 3rd 方客户端库吗
  • play.libs.WS API 使用的线程池是什么?如果我的应用程序执行了很多 WS 调用,我应该增加它的大小吗?
  • 有没有办法像 play.libs.WS API 一样异步,通过将第 3 方同步客户端包装在期货中?

非常感谢

洛伊克

4

1 回答 1

1

正如 Guillaume Bort 在 Play 邮件列表中所说,play.libs.WS API“有自己的线程池,由 AsyncHttp 库本身管理,但由于它在后台使用 NIO,所以没关系,因为它基本上是真的非阻塞。”

所以应该尽可能经常使用。

于 2013-05-13T12:31:39.343 回答