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

标签 java performance tomcat jax-rs jersey-2.0

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

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

最佳答案

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

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

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

例如,处理大约 1000 个并行请求同步网络服务。因此,为了处理这些请求,将创建​​ 1000 个线程。现在,考虑 asynchronous 环境中的相同情况。为了处理 1000 个并行请求,将创建​​ 2000 个线程 - 1000 个用于处理请求,1000 个用于异步 操作处理.

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

另一个原因是复杂性,异步总是很复杂,需要额外的代码来使事情异步。然而,像 Jersey 这样的框架在一定程度上隐藏了这种复杂性。

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

关于java - 为什么不对 JAX-RS 中的所有资源使用异步响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44855577/

相关文章:

java - 检查字符是否是拉丁字母的一部分?

c# - 将 DataRowCollection 转换为 DataRow[]

javascript - Intranet 站点的积极缓存与 Javascript 文件组合

java - 我正在为下表寻找合适的 JPQL 查询,以便它可以在 java 代码中工作,它不应该是 native 查询

java - 如何在另一个 Gui 中启动 JADE Gui?

java - 使用 Javascript 在我的 Facebook 墙上发布链接

jquery - asp.net 网站性能 - 1 个页面缓慢会影响同一浏览器 session 上的其余页面

tomcat - 以非管理员身份在 Win7 上运行 Tomcat 6

java - Maven 网络应用程序与 tomcat 5.5

Spring MVC :resources makes annotated controllers not available