如何使异步调用同步

时间:2015-08-13 14:23:46

标签: java web-services asynchronous synchronization

我们有一个现有的Web服务,基本上有两个调用:submitWork,pickupResponse。 Web服务的客户端通过调用submitWork()提交要处理的任务来提交transactionId响应,然后使用transactionId定期调用pickupResponse()来实际获取结果。在服务器内部,工作在几个不同的过程中执行,一些事件驱动,并且需要大约15秒才能完成 新的业务请求是使该进程处于同步调用中,这意味着客户端将调用newSubmitWork(),并且该调用将一直提供最终响应。 基本实现是:将这两个旧的执行包装在一个逻辑中,提交工作然后等待/循环以获取响应。这使得新的Web服务调用基本上花费大约15秒的时间。在多个并发请求的情况下,这样长的调用会在服务器中引起各种问题。例如,使用太多线程,或没有线程可用,然后超时。或者,最严重的情况是,呼叫到达服务器,开始处理,但客户端会超时,尽管逻辑实际上已完成。

我正在为这种情况寻找替代解决方案或做法,因此请提供相应的建议。

内部已经讨论了几个选项:

  1. 重写内部流程以便能够同步工作 - 新错误需要太长时间,太昂贵和高风险。
  2. 建议WS客户端向其发送带有结果的回调,而不是锁定调用 - 在这种情况下,所有WS客户端实际上都需要在他们一侧实现逻辑来处理该调用。
  3. 提升服务器资源,内存和线程 - 我个人认为这样做效率不高,因为它仍然存在高消息量的风险,超过服务器可以承担的风险。
  4. 与客户签订合同,在Y时间不会发送超过X条消息 - 这很不错,直到客户违反合同为止。
  5. 在我们这边构建一个网关WS,它将知道正在处理的当前请求的数量,并且在知道发生超时的可能性很高时将丢弃传入的请求。

1 个答案:

答案 0 :(得分:1)

  1. 如果您能够支付额外的Dev以使其成为同步,这是最干净的解决方案。

  2. 如果你没有资源去解决#1,我肯定会寻求解决方案。

  3. 你应该提高多少资源?当你的应用程序获得高负载时呢?没有什么能保证执行时间。这个解决方案肯定会导致间歇性的例外。

  4. X和Y取决于调用时服务器的负载量。您无法控制的变量太多。不是一个好的解决方案

  5. 我不明白这将如何使您的2项服务同步。

  6. 如果你匆忙,我肯定会去寻求解决方案#2。虽然,使用回调您的代码将更难阅读。否则#1最适合删除应用中所有不必要的同步逻辑。