为什么不对 JAX-RS 中的所有资源使用异步响应?

Why wouldn't you use Async responses for all resources in JAX-RS?

我正在梳理 JAX-RS 规范。一切似乎都很简单。但我留下了问题。为什么我不在任何地方都这样做?换句话说,缺点是什么?由于大多数资源请求最终都会到达数据库,难道你不希望所有资源请求都是异步的吗?

我应该注意哪些缺点?有一堆额外的开销吗?我还没有找到任何说明为什么你不应该这样做,只是如何做到这一点。

我认为这不是关于 JAX-RSAsync 功能,而是关于 synchronousasynchronous 操作。

如您所知,synchronous 操作使用单个 thread 来执行任务,而 asynchronous 操作需要创建额外的 thread 来执行任务。现在,这是开销 - 创建一个新的 thread,在新的 thread 中执行任务,然后销毁那个 thread。这种开销会影响性能。

不过,您可以重复使用已创建的 threads 而不是总是创建新的 thread。但是,仍然存在影响性能的额外线程。

例如,synchronous web service 处理大约 1000 个并行 requests。因此,为了处理这些 requests,将创建 1000 threads。现在,考虑 asynchronous 环境中的相同情况。为了处理 1000 个并行 requests,将创建 2000 个 threads - 1000 个用于处理 requests 和 1000 个用于 asynchronous 操作处理。

现在,您可以了解操作系统的负载。高负载会影响性能。如果任务很昂贵,即需要时间来执行,与 synchronous 执行相比,总体周转时间将减少。但是,如果任务不像数据库操作那样昂贵。与 synchronous 执行相比,总体周转时间会增加。这是由于处理额外线程的开销。

另一个原因是复杂性,asynchronous 总是很复杂,需要额外的代码来制作东西 asynchronous。然而,像 Jersey 这样的框架在一定程度上隐藏了这种复杂性。

因此,始终建议以 asynchronous 方式处理昂贵的操作,即执行需要时间的操作,以便减少总体周转时间。 Asynchronous 不建议每个操作都执行。