最新互联网大厂面试真题、Java程序员面试策略(面试前的准备、面试中的技巧)请移步GitHub
对于开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可以显著减少线程等待,从而在高吞吐量的场景中,极大提升系统的整体性能,显著降低时延。
因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。
接下来,我们一起来通过一个非常简单的例子学习一下,使用异步设计是如何提升系统性能的。
异步设计如何提升系统性能?
假设我们要实现一个转账的微服务 Transfer( accountFrom, accountTo, amount),这个服务有三个参数:分别是转出账户、转入账户和转账金额。
实现过程也比较简单,我们要从账户 A 中转账 100 元到账户 B 中:
- 先从 A 的账户中减去 100 元;
- 再给 B 的账户加上 100 元,转账完成。
对应的时序图是这样的:
在这个例子的实现过程中,我们调用了另外一个微服务 Add(account, amount),它的功能是给账户 account 增加金额 amount,当 amount 为负值的时候,就是扣减响应的金额。
需要特别说明的是,在这段代码中,我为了使问题简化以便我们能专注于异步和性能优化,省略了错误处理和事务相关的代码,你在实际的开发中不要这样做。
同步实现的性能瓶颈
首先我们来看一下同步实现,对应的伪代码如下:
Transfer(accountFrom, accountTo, amount) {
//先从accountFrom的账户中减去相应的钱数
Add(accountFrom, -1 * amount)
//再把减去的钱数加到accountTo的账户中
Add(accountTo, amount)
return OK
}
上面的伪代码首先从 accountFrom 的账户中减去相应的钱数,再把减去的钱数加到accountTo 的账户中,这种同步实现是一种很自然方式,简单直接。那么性能表现如何呢?接下来我们就来一起分析一下性能