我们有一个现有的Web服务,基本上有两个调用:submitWork,pickup响应。 Web服务的客户端通过调用提交transactionId响应的submitWork()来提交任务,然后周期性地使用transactionId调用pickup responResponse()以实际得到结果。在服务器内部,工作在几个不同的进程中执行,一些事件驱动,大约需要15秒才能完成。
新的业务请求是使该进程处于同步调用中,也就是说,客户端将调用newSubmitWork(),并根据需要提供最终响应。
基本的实现是:将这两个旧的执行包装在一个逻辑中,提交工作,然后等待/循环以获取响应。这使得新的Web服务调用基本上需要大约15秒的时间。在多个并发请求的情况下,这样长的调用会导致服务器中的各种问题。例如,使用太多的线程,或者没有超线程可用的线程。或者,呼叫到达服务器的最严重的情况开始处理,但客户端超时,但实际上已完成逻辑。
我正在寻找替代解决方案或这种情况下的做法,所以请告知。
已经在内部讨论的几种选择:如何使异步调用同步
- 重写内部流程能够工作同步 - 将采取新的错误过长,过于昂贵和高风险。
- 而不是锁定呼叫,建议WS客户端向他们发回一个带有结果的回调 - 在这种情况下,所有WS客户端实际上都需要实现逻辑来处理该呼叫。
- 提高服务器资源,内存和线程 - 我个人认为效率不高,因为它仍然具有高消息量的风险,超过服务器可以承担的风险。
- 与客户签订合同,在Y时间内不会发送超过X条消息 - 这很好,直到客户违约为止。
- 构建一个网关WS,在我们这边,知道当前正在处理的请求的数量,并在知道发生超时的高可能性时丢弃传入的请求。
以下方法可行吗? 1)在您的Web服务中,产生一个单独的线程来处理这两个任务。 2)向用户显示一条消息“你的请求将被处理”在启动线程后3)在15秒后显示实际结果 –
@ sunrise76这种方法仍然存在长时间等待的问题,并且如果将有许多并发请求服务器将超载。 – urir
我很好奇你的服务类型,需要15秒才能完成交易。您能否提供有关哪些子任务需要花费大量时间以及完成这两项任务的总跳数的深入见解? –