【问题标题】:Calling Many Different Webservices in parallel from a Web Application从 Web 应用程序并行调用许多不同的 Web 服务
【发布时间】:2017-04-12 09:44:13
【问题描述】:

在我走得更远之前,我想向您保证,我已经完成了尽职调查并在网上搜索了建议/答案。特别是,我查看了以下帖子:

Calling Different Webservices in parallel from Webapp

在上面的帖子中,您将看到 user1669664 必须“通过一种方法进行大约 15 次不同的网络服务调用。”

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

事情是……

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

如果能听到建议/建议,我将不胜感激。我不想写 230 Callables...!

谢谢。

【问题讨论】:

  • 您可以在循环中编写它们,如果它们除了 url 之外没有变化。您需要提供的是一个包含所有 230 个 URL 的数组来调用。
  • 一个请求到底要怎么调用 230 次网络服务?
  • 嗨 kism3t...你是对的,只有 url 会有所不同。请您扩展您的答案。目前我的代码正在循环运行,一次调用每个 Web 服务。这种方法的问题是耗时太长。
  • 嗨,Kayaman...我只能说,我为一个拥有许多地点的大型组织工作。我需要向每个位置发送消息。你能做的任何事情都会很棒。谢谢。
  • 听起来你遇到了比你能解决的更大的问题。为类似的事情推出自己的解决方案是错误#1,没有经验的人试图改进这是错误#2。你不需要网络服务,你可能会用一个简单的发布-订阅消息队列做得很好。

标签: java web-services concurrency


【解决方案1】:

@Kayaman 说了什么:)

时间要求是什么?您是否需要在 X 秒内成功执行所有 230?网络服务器如何控制默认超时?是否所有请求都需要生成200?如果单个请求失败会发生什么?是否必须重试直到成功?如果某个百分比失败,您是否必须使所有其他请求无效?那么退避呢?

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

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

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

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

此架构可能包含有界线程池和队列。当每个 Web 请求进入时,它会将 URL 排入队列,并且线程池可以处理它们。如果你需要返回值,你可以有一个返回值队列。我喜欢的是生产者(Web 请求处理程序)和消费者(线程池)都以同步方式编写,并发是由运行时通过在线程池上执行提取器来实现的。

Kayaman 谈到了一种常用的方法来解决这个问题:将长时间运行的进程从 Web 请求的上下文中移除。这种架构可能看起来很像内部线程池和队列,但它是进程间的。该队列将是一个外部进程作业/消息队列,消费者将从中提取。然后 Web 请求将触发 230 条消息并返回给客户端。并且异步消费者将不断从队列中拉出并发出请求:)

【讨论】:

  • 哇...感谢您提供如此详细的答案,dm03514!正如之前的评论中提到的,我的能力非常有限……遗憾的是,我不能使用队列。但我确实喜欢查看网络服务器并使用默认超时做某事的想法。
  • 您应该能够在网络请求的上下文中在内部使用队列。 stackoverflow.com/a/2332581/594589
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2011-02-25
  • 2013-03-30
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多