1.什么是异步?
先理清楚几个概念:
1)同步:请求需要立即返回结果。
2)异步:请求无需立即返回结果。
3)阻塞:请求需要等待结果返回。
4)非阻塞:请求无需等待结果返回。
平时说的异步请求一般特指异步非阻塞请求,
毕竟无需立即返回结果,那也不必一直等待结果返回。
2.何时使用异步?
异步常用于以下技术场景:
1)存在大量的任务,大多数时间至少有一个任务在执行。
2)任务执行大量的I/O操作,导致一个同步的程序浪费大量的时间在阻塞当其他的任务可以执行时。
3)任务之间是相互独立的,各个任务很少需要内部的交流(如因为一个任务等待另一个任务)。
异步常用于以下业务场景:
1)接口响应时间过长的情况,如涉及多端甚至外部厂商、银行等情况。
2)接口涉及较长流程,如需人工介入的情况。
3.异步有哪些方法?
异步编程模式:
1)观察者模式:将返回结果主动传递给请求方接口。
2)发布订阅模式(有注册中心的观察者模式):Mafka。
3)响应式编程(封装过的观察者模式,屏蔽了线程同步和并发问题):常用于 Web 项目。
异步编程方法:
1)请求响应式:RPC请求后直接返回接收结果。
2)事件驱动式:将返回结果通过消息中间件返回。
4.异步有哪些问题?
同步转异步
1)Future 和 FutureTask,通常配合线程池使用,实现并发。
2)Callback,通过回调机制实现。
3)CompletableFuture,任务编排。
异步转同步
共享资源的情况下可用:
1)Synchronized 实现
2)Lock实现
其他情况:
1)CountDownLatch解决
5.异步编程最佳实践
TODO
参考文档:
《亿级流量网站架构和新技术》——13 异步并发实战