我正在梳理 JAX-RS 规范。一切似乎都很简单。但我留下了问题。为什么我不在任何地方都这样做?换句话说,缺点是什么?由于大多数资源请求最终都会到达数据库,您不希望所有资源请求都是异步的吗?
我应该注意哪些缺点?有一堆额外的开销吗?我一直没能找到任何说明为什么你不应该这样做,只是如何做到这一点。
最佳答案
我认为这不是关于 JAX-RS
的 Async
特性,而是关于 synchronous
与 asynchronous
操作。
如您所知,同步
操作使用单个线程
来执行任务,而异步
操作需要创建额外的线程
执行任务。现在,这是开销 - 创建一个新的 thread
,在新的 thread
中执行任务,然后销毁那个 thread
。这种开销会影响性能。
不过,您可以重用已经创建的threads
,而不是总是创建新的thread
。但是,仍然存在影响性能的额外线程。
例如,处理大约 1000 个并行请求
的同步网络服务
。因此,为了处理这些请求
,将创建 1000 个线程
。现在,考虑 asynchronous
环境中的相同情况。为了处理 1000 个并行请求
,将创建 2000 个线程
- 1000 个用于处理请求
,1000 个用于异步
操作处理.
现在,您可以了解操作系统的负载。高负载会影响性能。如果任务代价高昂,即需要时间来执行,与同步
执行相比,总体周转时间将减少。但是,如果任务不像数据库操作那样昂贵。与同步
执行相比,整体周转时间会增加。这是由于处理额外线程的开销。
另一个原因是复杂性,异步
总是很复杂,需要额外的代码来使事情异步
。然而,像 Jersey
这样的框架在一定程度上隐藏了这种复杂性。
因此,始终建议以异步
方式处理昂贵的操作,即执行需要时间的操作,以便减少整体周转时间。不建议对每个操作执行 异步
。
关于java - 为什么不对 JAX-RS 中的所有资源使用异步响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44855577/