java - 如何使异步调用同步

标签 java web-services asynchronous synchronization

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

6年前关闭。




Improve this question




我们有一个现有的网络服务,基本上有 2 个调用:submitWork、pickingResponse。 Web 服务的客户端通过调用提供 transactionId 响应的 submitWork() 提交要处理的任务,然后定期调用带有 transactionId 的pickupResponse() 以实际获取结果。在服务器内部,工作在几个不同的进程中执行,一些事件驱动,大约需要 15 秒才能完成。
新的业务请求是使该流程处于同步调用中,这意味着客户端将调用 newSubmitWork() 并且该调用将尽可能提供最终响应。
基本实现是:将这两个旧执行包装在一个逻辑中,提交工作,然后等待/循环以获取响应。这使得新的 Web 服务调用基本上需要大约 15 秒的时间。在多个并发请求的情况下,如此长的调用会导致服务器出现各种问题。例如,使用太多线程,或者没有可用的线程然后超时。或者,最严重的场景,调用到达服务器,开始处理,但客户端超时,尽管逻辑实际上已经完成。
我正在为这种情况寻找替代解决方案或做法,因此请就此提出建议。
已经在内部讨论过的几个选项:

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

  • 如果您能负担得起额外的开发人员使其同步,这是最干净的解决方案。
  • 如果您没有资源来寻求解决方案#1,我肯定会选择该解决方案。
  • 你应该筹集多少资源?当您的应用程序负载高时怎么办?没有什么能保证执行时间。此解决方案肯定会导致间歇性异常。
  • X 和 Y 将取决于您的服务器在调用时获得的负载量。你无法控制的变量太多。不是一个好的解决方案。
  • 我不明白这将如何使您的 2 项服务同步。

  • 如果您赶时间,我肯定会选择解决方案#2。虽然,使用回调将更难阅读您的代码。否则,#1 是最好的,因为您删除了应用程序中所有不必要的异步逻辑。

    关于java - 如何使异步调用同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990953/

    相关文章:

    java - 我如何在 weblogic 中使用 log4j2?

    java - 在哪里包括 @Webresult ,@WebMethod 等

    c# - 如何禁用 ASP.NET 中某些控件的 UpdateProgress?

    asynchronous - 来自 BookSleeve Redis 客户端的缓存异步错误

    java - 如何在单击列表中父级的特定项目时扩展子级?

    java - 如何在 SWT 中触发自定义事件?

    java - 向 Jetty 请求添加/编辑请求参数

    c# - 如何从 C# Controller 重定向到外部 URL

    java - 使用 JiBX 的 Spring Web 服务

    python - 如何使 send() 调用异步?