在进一步介绍之前,我想向您保证,我已经进行了尽职调查,并在网上搜索了建议/答案。特别是,我看了以下文章:
Calling Different Webservices in parallel from Webapp
在以上文章中,您将看到user1669664必须“通过一种方法进行大约15个不同的Webserivce调用”。
我已阅读了由马特b提供的最佳答案。这个答案基本上需要为每个不同的Webservice调用编写一个Callable。
事情是...
我在更大范围内也遇到了类似的问题-我需要进行约230个Web服务调用。
听到建议/建议,我将不胜感激。我不想写230 Callables ...!
谢谢。
最佳答案
@Kayaman说了什么:)
几点要求?您需要在X秒内成功执行所有230吗?您如何控制网络服务器的默认超时?是否所有请求都需要产生200
?如果单个请求失败,该怎么办?您必须重试直到成功吗?如果某个百分比失败,是否必须使所有其他请求无效?退缩呢?
如果您无法串行执行请求,则会留下某种并发代码。并发代码比同步代码更困难。同步内存访问或w / e有太多的代码路径变体需要考虑。
如果必须在Web请求的上下文中执行请求,通常最好将并发(线程池)限制为一定数量。
如果有一个硬编码的230,它是一个设置的数量,但仍然可能太大。如果这是一个公共端点,那么没有什么可以阻止某人对您的服务器发起10,000个并发请求,并且如果您可以为230个URL中的2,300,000个并发请求提供所有这些服务!因此,所有资源都应具有某种合理的界限。如果您从数据库中提取网址,则任意用户可能会添加不受限制的网址。
一种简单的方法是使用线程池来限制并发性。
为此的体系结构可以包括一个有界线程池和一个队列。当每个Web请求进入时,它将使URL排队,并且线程池可以处理它们。如果需要返回值,则可以有一个返回值Queue。我喜欢的是,生产者(Web请求处理程序)和使用者(线程池)都是以同步方式编写的,并发是通过在线程池上执行提取程序来由运行时实现的。
Kayaman提出了一种通常用于解决此问题的方法:从Web请求的上下文中删除长时间运行的进程。这种体系结构看起来很像内部线程池和队列,但是将是进程间的。该队列将是一个外部流程作业/消息队列,而使用者将从中退出。然后,Web请求将触发230条消息并返回到客户端。异步地,使用者将不断从队列中拉出并发出请求:)