我的Java Play2应用正在调用一些外部Web服务,以通过同步的第三方客户端库获取数据。对于这个应用程序,我需要高流量和可扩展性。
播放文档说:
您的代码可能被阻止的情况包括:
通过第三方客户端库使用REST / WebService API(即,不
使用Play的异步WS API)
[...]
请注意,因此您可能会倾向于将阻止代码包装在Future中。这并不是说非阻塞,而是意味着阻塞将在不同的线程中发生[...]
相反,以下类型的IO不会阻塞:
Play WS API,...
在Play2 Java应用中,使用诺言使事情异步并不是真正有用,因为默认的播放池用于Futur任务。结果,使用大量Futur的结果与仅使用具有大型默认线程池的同步调用的结果相同:在同一池中线程的数量大致相同。
所以我的问题是:
Java API中的play.libs.WS API是否真正异步(不阻止play默认池中的任何线程)?
如果我想要高流量和可扩展性,我应该始终使用它而不是我的第三方客户端库吗?
play.libs.WS API使用的线程池是什么?如果我的应用程序执行很多WS调用,我应该增加它的大小吗?
通过在期货中包装第三方同步客户端,有没有办法像play.libs.WS API那样异步?
非常感谢
洛伊奇
最佳答案
正如Guillaume Bort在Play邮件列表中所说,play.libs.WS API“具有自己的线程池,由AsyncHttp库本身管理,但是由于它在后台使用NIO,所以没关系,因为它实际上是非阻塞。”
因此,应尽可能频繁地使用它。