本文转载自微信公众号《程序新视界》,作者是二哥。转载本文请联系程序新视界公众号。打开这篇文章,首先要说的是,这篇文章不仅仅是一个知识点,更重要的是一个学习方法:提问和验证。前言最近在研究SpringBoot的异步处理,准备写一篇文章。在搜集资料的时候,我发现了一篇文章?,以及它的很多衍生文章。文章确实不错,但是文中提到的“异步请求和异步调用”这两个概念一直让人百思不得其解,衍生文章中也夹杂着。最后忍不住想一探究竟,发现除了那篇文章和派生文章外,没有其他证据可以区分这两个概念。这个疑惑直到七年前在StackOverflow上找到一篇文章才解开。今天,我就带大家来探讨一下“异步请求和异步调用”这两个概念。异步请求和异步调用的区别在上面提到的文章中,有两段是关于异步请求和异步调用的区别的:区别一:异步请求用于解决并发请求对服务器造成的压力,从而提高throughputofrequests异步调用用于做不在主线进程中,不需要实时计算和响应的任务,比如将日志同步到Kafka进行日志分析。区别二:异步请求会一直等待响应,需要将结果返回给客户端;而异步调用往往会立即返回客户端完成整个请求。至于异步调用的任务,可以在后台运行。客户不在乎。仔细阅读分析,文中所说的异步请求应该是指通过Servlet的AsyncContext对象或者Spring中的Callable、DeferredResult、WebAsyncTask等对业务进行异步处理。文中异步调用指的是类似如下的异步方法在Spring中调用@Async注解。看到上面两个概念的区别,你觉得有道理吗?是不是觉得自己成功区分了异步请求和异步调用呢?那么,大家有没有想过一个问题,我们平时说的请求接口和调用接口的时候呢?不是一样的意思吗?怎么在这里变成了两个完全不同的概念呢?疑惑探索带着以上疑惑,开始用搜索引擎搜索。发现在搜索“异步请求和异步调用的区别”时,查到的内容基本都是来自上面的文章和衍生文章,或者说异步和同步的区别。这没什么好说的,但也说明这两个概念的区别并没有得到普遍认可。于是我开始尝试通过英文搜索引擎进行搜索。我先是搜索“异步调用和异步请求的区别”,没有找到想要的结果。大部分文章还是在讲异步和同步的区别。换个关键词搜索“异步调用和异步方法的区别”,结果一样,没有想要的文章。但是我在StackOverflow上发现了一个相关问题“SynchronousVsAsynchronousrelatedtowebservices”。问题下方出现两个短语:Asynchronousservice和Asynchronouscalls。仔细看两句的解释,发现是想要的结果。Asynchronouscall和asynchronousservice其实在英文搜索的过程中已经发现了。在讨论异步和同步的区别的时候,经常会出现异步请求和异步调用这两个词组,都是在说异步和同步的区别,而两者并没有什么区别。所以无论是异步调用还是异步请求,本质上都是一回事。?一文中提到的异步请求和异步调用的区别,并没有从概念上明确什么是异步请求,什么是异步调用。而且也只有那几篇文章讲到,所以可以认为异步请求和异步调用是同一个概念(异步调用)。作者所说的“异步调用”指的是异步服务(Asynchronousservice)。为了进一步证明上述结论,下面将问答中对两个概念的解释简单翻译一下。异步服务和异步调用异步服务在您的Web服务执行时会占用大量时间,例如从文件系统读取大文件。这时候如果使用“同步”的web服务,客户端必须等待处理完成,通常会阻塞线程,对于高并发的服务,就会出现性能问题。如果将web服务设置为异步服务,可以将耗时的服务委托给另一个线程,或者使用非阻塞机制在未来的某个时间点返回。以读取大文件为例,可以使用异步ReadFile方法读取大文件。这避免了线程阻塞并提高了吞吐量。异步调用值得注意:您可以异步调用非异步服务。例如,Ajax在JavaScript中调用:varjqxhr=$.ajax("AnyService.svc").done(function(){alert("success");}).fail(function(){alert("error");}).always(function(){alert("complete");});alert("Called");执行上面的例子,先显示“Called”,再显示“success”,因为不需要等到服务返回结果。并且被调用的服务也不需要是异步的。总之,服务实现的异步和同步特性完全独立于客户端调用的异步和同步特性。也就是说客户端可以异步调用同步服务,客户端也可以同步调用异步服务。总结通过上面的跟踪分析,我们可以了解到异步请求和异步调用是一回事。同时我们也了解到,所谓客户端异步同步和服务异步同步是相互独立的。即客户端可以异步请求也可以同步请求,服务可以异步处理也可以同步处理。成对组合可以有四种情况。另外,更重要的是,我们要学会通过查找中英文资料来解答自己的疑惑,而英文资料相对准确一些,所以英文是首选。在探索疑难问题的过程中,往往会有许多意想不到的收获。
