2017-04-12 104 views
1

在我进一步深入之前,我想向您保证我已经尽了我的尽职调查并搜索了网络上的建议/答案。特别是,我看了看下面的帖子:从Web应用程序中并行调用多个不同的Web服务

Calling Different Webservices in parallel from Webapp

在上面的帖子,你会看到user1669664有“做了大约15种webserivce从一个方法调用的所有。”

我已阅读由matt提供的最佳答案。这个答案基本上需要为每个不同的Web服务调用编写一个Callable。

的事情是...

我有一个更大的规模类似的问题 - 我需要约230 Web服务调用。

我会很高兴听到意见/建议。我不想写230个可卡因......!

谢谢。

+0

如果它们除了url之外没有变化,您可以在循环中编写它们。你需要提供的是一个包含所有230个URL的数组。 – kism3t

+0

一个请求怎么需要做230个webservice调用? – Kayaman

+0

嗨kism3t ...你是对的,只有网址会有所不同。请你扩大你的答案。目前我的代码正在运行一个循环,每次调用一个web服务。这种方法的问题是它需要很长时间。 – user2318704

回答

1

@Kayaman说什么:)

什么时间要求?你需要在X秒内成功执行所有的230次吗?你怎么样控制默认的超时?所有请求是否需要导致200?如果一个请求失败会发生什么?你必须重试,直到成功?如果某些百分比失败,您是否必须使所有其他请求无效?退休怎么样?

如果您不能以串行方式执行请求,则会留下某种并发代码。并发代码比同步代码更困难。有太多的代码路径变体需要推理,同步的内存访问或w/e。

如果您必须在Web请求的上下文中执行请求,那么将并发(线程池)限制为设定数量通常是个好主意。

如果硬编码230是一个设定量,但仍然可能太大。如果这是一个公开可用的端点,则没有任何东西阻止某人向您的服务器发起10,000个并发请求,并且如果您可以为所有这些请求提供2,300,000个并发请求,而不是针对您的230个URL,那么!!!!!!!!正因为如此,所有的资源都应该有某种理智的界限。如果你从一个数据库中取出url,并且任意一个用户可能会添加无限制且不好的url。

一个简单的方法是使用线程池来限制并发。

这个架构可能由一个有界线程池和一个队列组成。当每个Web请求都进入时,它会排队URLS并且线程池可以处理它们。如果你需要返回值,你可以有一个返回值队列。我喜欢的是生产者(web请求处理程序)和消费者(线程池)都是以同步样式编写的,并发性是通过在线程池上执行fetchers来实现的。 Kayaman提到了一种常用于解决此问题的方法:将长时间运行的进程从Web请求的上下文中取出。这个架构可能看起来很像内部线程池和队列,但会是进程间的。该队列将是一个外部进程作业/消息队列,消费者将从该队列中拉出。然后,Web请求会触发230条消息并返回给客户端。而异步的消费者将不断地从队列中拉出并发出请求:)

+0

哇......谢谢你这样详细的回答,dm03514!正如前面的评论中所提到的,我对我所能做的事情非常勉强......可悲的是,我不能使用队列。但我确实喜欢看网络服务器的想法,也许会用默认的超时时间做一些事情。 – user2318704

+0

您应该可以在Web请求的上下文中内部使用队列。 http://stackoverflow.com/a/2332581/594589 – dm03514

相关问题