2015-08-13 173 views
0

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

我正在寻找替代解决方案或这种情况下的做法,所以请告知。

已经在内部讨论的几种选择:如何使异步调用同步

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

以下方法可行吗? 1)在您的Web服务中,产生一个单独的线程来处理这两个任务。 2)向用户显示一条消息“你的请求将被处理”在启动线程后3)在15秒后显示实际结果 –

+0

@ sunrise76这种方法仍然存在长时间等待的问题,并且如果将有许多并发请求服务器将超载。 – urir

+0

我很好奇你的服务类型,需要15秒才能完成交易。您能否提供有关哪些子任务需要花费大量时间以及完成这两项任务的总跳数的深入见解? –

回答

1
  1. 这是最干净的解决方案,如果你能负担得起额外的开发,使之同步。

  2. 如果您没有足够的资源去解决#1问题,我肯定会去解决这个问题。

  3. 你应该提高资源多少?什么时候你的应用程序获得高负载?没有什么能保证执行时间。这个解决方案将最终导致例外。

  4. X和Y将取决于您的服务器在拨打电话时获得多少负载。太多的变量,你不能控制。不是一个好的解决方案

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

如果你急于求成,我会毫不犹豫地去找解决方案#2。虽然,您的代码将更难以用回调进行阅读。否则#1是最好的,因为你的应用程序中删除所有不必要的配对逻辑。

+0

1.目前看起来像是一个很大的NO NO 2.很酷,谢谢3.这确实是最大的问题,我们不确定期望什么以及最大期望负载是多少。 4.对。 5.这是为了保护已经同步的过程形式超载。 – urir

+0

我只会将客户端的超时值调整为合理的值。如果请求超时,客户端会知道服务器上有很大的负载。否则,如果您放弃请求,则从客户端角度来看,它看起来一切正常。 – pmartin8

+0

我看不到长客户端超时如何解决问题。说客户端定义X秒超时,他的请求等待服务器开始处理X-1秒(服务器没有可用的线程),服务器开始处理,并在1秒后客户端获得超时... – urir