为什么不对 JAX-RS 中的所有资源使用异步响应?
Why wouldn't you use Async responses for all resources in JAX-RS?
我正在梳理 JAX-RS 规范。一切似乎都很简单。但我留下了问题。为什么我不在任何地方都这样做?换句话说,缺点是什么?由于大多数资源请求最终都会到达数据库,难道你不希望所有资源请求都是异步的吗?
我应该注意哪些缺点?有一堆额外的开销吗?我还没有找到任何说明为什么你不应该这样做,只是如何做到这一点。
我认为这不是关于 JAX-RS
的 Async
功能,而是关于 synchronous
与 asynchronous
操作。
如您所知,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
不建议每个操作都执行。
我正在梳理 JAX-RS 规范。一切似乎都很简单。但我留下了问题。为什么我不在任何地方都这样做?换句话说,缺点是什么?由于大多数资源请求最终都会到达数据库,难道你不希望所有资源请求都是异步的吗?
我应该注意哪些缺点?有一堆额外的开销吗?我还没有找到任何说明为什么你不应该这样做,只是如何做到这一点。
我认为这不是关于 JAX-RS
的 Async
功能,而是关于 synchronous
与 asynchronous
操作。
如您所知,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
不建议每个操作都执行。