概述
随着移动互联网的迅猛发展,我们对于服务的响应和并发要求越来越高。在这样的背景下催生了形形色色的并发问题、例如C10问题就是非常典型的问题。对于这些形形色色的并发问题,人们演化设计出多种异步编程的模型。所谓的并发是指在同一时间段内程序能交替运行。
关于异步编程思考
在开始之前有这么几个问题需要探讨,什么是异步编程模型、异步编程能解决哪些问题、如何设计出一个异步编程模型。
什么是异步编程
同步/异步:是指程序自始至终都在用一个时间线上运行,异步则是我程序是主时间线上出现了别的时间线分支。
异步编程解决了什么问题
异步编程的宗旨:是高效地解决并发问题,获得更高的并发请求
异步编程具体实现方案
- 事件轮询
将数据交互过程中出现的各种事件注册到一个事件队列中,再由一些其他的线程来异步消费处理
- 回调
在上述的事件队列中,其实有个问题,往事件队列中注册一个事件之后,等该事件被触发的那刻,谁来处理后续的业务逻辑?对于这个问题的解决方式就是“回调”,现在高级编程语言都支持“回调”功能。有了“回调”,开发者可以在事件触发前将回调函数和事件绑定起来,等事件触发那一刻,查找出注册好的回调函数在去执行回调函数的逻辑。至此通过回调就轻松实现了异步编程模型。
- 协程
虽说有了回调就就能满足异步编程,但是回调带来的问题也相当多,比如回调中嵌套回调(地狱回调)、代码不符合人类思维、难于开发维护等。其实人类编程思维还是习惯于同步的编程逻辑,在代码按照书写的顺序一行一行去执行,每次执行结束都能有个返款!!!那么说到这里有没有一种可能?就是我既能达到异步的效果还能书写同步的代码,换言之:就是用同步的代码书写异步的情怀!!!答案是肯定的,协程真是这样背景下出现的一个将异步回调的方式转化为同步代码、但是又有异步功能的技术。协程是一种轻量级线程,调度的逻辑完全就交给用户去控制。这样用户就可以在遇到同步IO的时候 ,挂起当前协程转而执行下一个协程,整个代码逻辑都是顺序书写,被挂起的协程,等待下次再次调度执行。
盘点主流语言和服务器软件异步模型
在这边一起梳理一下市面上主流语言和软件的一些异步编程模型
nginx 是多进程+单进程reactor异步模型,网络请求事件都有reactor线程接管注册分发给worker进程去执行
redis 单线程 reactor异步模型 也是事件分发注册异步编程
netty 单线程reactor异步模型
swoole 多线程reactor+多进程worker
nodejs 单线程+eventLoop
Golang 单线程Reactor+多线程协程
总结
任何技术方案都是在历史长河中演化而来,因此了解一门技术或者方案,最好能了解一下他的前世今生!!!