同步/异步/select/poll/epoll
以吃饭为案例
民以食为天
同步模式
单位食堂上了新的自助模式,经过几天的体验,很快就有人骂。领导派人调查,发现吃饭的模式大概是这样:
- 排一队选餐具
- 排一队选菜
- 排一队选主食
- 排一队付款
- 有时候可能还要排队等座位
食堂负责人(据说是公司x总的亲戚)晚上汇报说:我们食堂很不错,同时容纳下来八百人呢!
x总大骂:傻逼,容纳那么多人,都在排队。员工耽误时间,你挣钱慢,老子还跟着挨骂。有人告诉董事长说每天员工排队吃饭一小时半。老头子现在想砍我呢。
食堂改革,势在必行!上报领导,下利小民!
异步模式
秘书小李告诉x总,某部门程序员,3个人一组,商量好吃什么后,一个人负责拿餐具,一个选主食,一个选菜。最后一起去付账。比别人节省大半时间。
x总依稀记得大学时候的功课,哦,这个就是异步模式啊!
- 不是强依赖关系的工作,就不应该顺序来做。
于是在食堂门口贴出告示,推广这个先进经验。
员工吃饭时间大大缩短。
董事长大悦之余,问x总:怎么之前我没发现排队这么麻烦呢?
x总答复说:领导,因为当时都是我们几个给您拿的菜。我们就是您的分身。
x总的季度报告:我们成功的在日常管理中引入了异步模式——分身有术,让普通员工也能享受到这样的便利。
select模式
公司和食堂都是蒸蒸日上,不断壮大,菜品数量也多了,员工吃饭时间又慢慢增加,怨言也增多。 董事长脾气慢慢变坏,各副总挨骂次数逐渐增加,大家得知原委后,一起压迫x总。
x总经过调查,发现员工遇到这样的情况:
下单了几个菜,隔会儿去查一下这个菜有没有来,一会儿查一下另外一个菜,都快成神经病了。
董事长听到后,呵呵一笑:
这些年轻人啊,too young too simple,哪用得着这样麻烦,问服务员就可以了。
x总解释说:
领导,您是一直在VIP包厢。
对了,领导,您说到关键点了,我们给每个员工建立VIP服务。
董事长也马上明白了:对对对。
不过又马上迷糊了:你要这样搞,我们食堂得增加多少包厢?多少服务人员?
x总于是解释:
领导,咱们是科技公司,用科技手段来做这个:VIP通道点菜。
(以下的描述比对JDK的java.nio.channels.Selector,可以忽略括号内的技术内容)
食堂提供点菜窗口(Service),员工有个点菜器(Selector),这个就是我们给员工提供的食堂VIP服务。
员工找到点菜窗口,建立服务请求(SocketChannel#connect()),再将这次的服务注册到点菜器里面(SocketChannel#register)。
从绑定后开始,员工可以随时查询点菜器(Selector#select()),每次会返回0到若干个查询结果(SelectionKey),每个查询结果里面包含服务状态和绑定的服务窗口。
有这些服务状态:
- 连接成功(
SelectionKey#OP_CONNECT), - 可以接受下单(
SelectionKey#OP_WRITE),员工可以通过绑定的窗口开始下单点菜 - 菜已经准备好(
SelectionKey#OP_READ),员工可以从绑定的窗口拿菜
董事长再度大悦,让x总汇报先进经验。
x总说,我们成功的将先进的select模式引入到了我们的日常管理,彻底改变了我们的工作方式。
select模式——一个工具完成全部的交互衔接管理。
poll
增加了食堂的流量后,后厨的压力增大,于是改造成先进的select模式。
也会有点菜器,大体上与员工的差不多,主要的差别在于:
- 服务通道是由员工发起的,
- 后厨只要监听几个窗口就可以了
但是在长时间使用后,发现后厨的订单量非常大,点菜器的处理效率跟不上。于是在这个基础上做了升级,点菜器进入到后厨的核心部分,高优先级;同时优化了结构算法。
年底汇报,x总把这个技术提升换了个新名称poll,再次夺得年终述职头彩。
BTW:员工就餐的流程,因为单量不大,流程改进的意义不大了。即使一个部门百十人统一订餐,也就产生几百份菜的订餐。
epoll
时间继续前进,公司也在前进,员工数增加,食堂的服务量也在飞速增长。原有的工作流程再次体现出来不足,具体来说,流程本身的执行成本占据了比较多的工作时间。
受启发于之前的流程改进,x总意识到:
在高流量下,工作重点应该倾向于流程控制
于是他决定由流水线来作为控制者,具有最高权限:
- 首先将操作分为内部操作和外部操作:
- 内部操作就是厨师们的工作,例如清洗原料,做菜,这些只是在厨房内部处理的事情
- 涉外操作是要跟外部发生来回传递的工作,例如接订单、回订单、找库房要原材料……
在涉外操作发生时候,是不可能立刻等到结果的
- 一次请求处理过程,形成一个流程单,将流程单放到流水线上,
- 在涉外操作发生后,结果返回之前,流水线会立刻将流水单挂起,并且打上标记。然后去处理别的流水单。
- 当涉外操作等到外部响应的时候,会立刻给
留下评论