multithreading - 用于异步 Web 服务的 Java ExecutorService

标签 multithreading web-services asynchronous callback executorservice

我们需要实现异步 Web 服务。

  • 网络服务的行为:

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

  • 问题:

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

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

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

最佳答案

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

我不确定我是否知道这种情况的最佳选择,但还有其他考虑因素:

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

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

听起来 Web 服务应该有一个允许用户查询状态的 URL。

关于multithreading - 用于异步 Web 服务的 Java ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37320249/

相关文章:

linux - 多线程 Linux 与 Windows

java - Swing Worker 线程意外停止执行代码

java - 在java中将时间戳转换为日期

web-services - 在 REST API 中使用 HTTP status 207 的适用场景是什么?

javascript - 错误 : Warning: setState(. ..):无法在现有状态转换期间更新(例如在 `render` 或另一个组件的构造函数内)

c# - RestSharp - 异步请求回复模式

c++ - 线程同时读/写

c - Linux 中多线程的自动使用

android - 适用于 Android 的 KSOAP2 提供

c# - 如何对该异步代码进行单元测试?