同步/异步/select/poll/epoll

1 分钟读完

以吃饭为案例

民以食为天

同步模式

单位食堂上了新的自助模式,经过几天的体验,很快就有人骂。领导派人调查,发现吃饭的模式大概是这样:

  • 排一队选餐具
  • 排一队选菜
  • 排一队选主食
  • 排一队付款
  • 有时候可能还要排队等座位

食堂负责人(据说是公司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总意识到:
在高流量下,工作重点应该倾向于流程控制

于是他决定由流水线来作为控制者,具有最高权限:

  • 首先将操作分为内部操作和外部操作:
    • 内部操作就是厨师们的工作,例如清洗原料,做菜,这些只是在厨房内部处理的事情
    • 涉外操作是要跟外部发生来回传递的工作,例如接订单、回订单、找库房要原材料……
      在涉外操作发生时候,是不可能立刻等到结果的
  • 一次请求处理过程,形成一个流程单,将流程单放到流水线上,
  • 在涉外操作发生后,结果返回之前,流水线会立刻将流水单挂起,并且打上标记。然后去处理别的流水单。
  • 当涉外操作等到外部响应的时候,会立刻给

留下评论