【问题标题】:Java ExecutorService for Async web service用于异步 Web 服务的 Java ExecutorService
【发布时间】:2016-09-16 03:47:58
【问题描述】:

我们需要实现一个异步网络服务。

  • 网络服务行为:

我们将帐户请求发送到服务器,然后服务器发送回带有确认 ID 的同步响应。之后,我们收到多个包含该确认 ID 的回调请求。确认 ID 的最后一个回调请求将在响应中包含一个文本(完成:true),这将告诉我们这是该帐户和确认 ID 的最后一个回调请求。这将帮助我们知道特定帐户的异步调用已完成,我们可以标记其最终状态。我们需要为多个帐户执行此 Web 服务。因此,我们将收到许多帐户的回调请求。

  • 问题:

处理来自多个帐户的多个回调请求的最佳方法是什么。

  • 我们想到的解决方案:
  • ExecutorService 固定线程池:这将并行处理我们的回调请求,但问题是它不保持顺序。因此,我们很难确定最后一个确认 ID(帐户)的回调请求已经到来。因此,我们无法确定该帐户的最终状态为已完成。
  • ExecutorService 单线程执行器:这里,池中只有一个线程存在一个无边界队列。如果我们使用它,那么处理将非常慢,因为实际上只有一个线程在处理。

请提出一种实现内存和性能要求的最佳方法。

【问题讨论】:

    标签: multithreading web-services asynchronous callback executorservice


    【解决方案1】:

    让我们明确一件事:HTTP 是一种阻塞的同步协议。请求/响应对不是异步的。您正在做的是产生异步请求并返回给调用者,让他们知道请求正在处理(HTTP 200)或未处理(HTTP 500)。

    我不确定我是否知道最适合这种情况,但还有其他考虑:

    1. 使用您可以配置的ExecutorServiceThreadPool。确保您有一个前缀,可以让您将这些线程与其他线程区分开来。
    2. 将请求任务添加到阻塞的出列队列,并让一个消费者线程池处理它们。您可以调整出队和使用者线程池的大小。
    3. 如果处理密集,请将请求消息发送到在另一台服务器上运行的队列。让队列侦听器池处理请求。

    您不能假设回调将按特定顺序返回。不要依赖“最后”是“真的”。您必须将所有这些线程连接在一起才能知道它们何时完成。

    听起来 Web 服务应该有一个 URL,可以让用户查询状态。

    【讨论】:

    • Webservice 没有 URL 来告诉它已经发送了所有的回调。即使他们告诉我们他们已经发送给我们,我们的最终状态仍然取决于我们是否收到了所有的回调。这就是为什么我们要继续使用 ExecutorService 固定线程池,但看起来我们应该使用 ExecutorService 单线程执行器。
    • 添加一个。如果它们还没有全部返回,则返回 false;就是这样。线程池不会改变这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-09-03
    • 2011-04-28
    相关资源
    最近更新 更多