小王住在某城市, 生活并长大. 最近, 小城引进了一个企业, 邮局. 这个邮局可了不得, 只要你花上几角钱, 就可以将一封信送到千里之外的朋友手中. 小王也趁机体验了一把, 得劲.
这天, 小王躺在床上想, 既然这个邮局这么好, 咱何不从中分一杯羹呢? 但是现在人家邮局基本都可以说是垄断了, 咱这刚刚起步又能如何呢? 哎, 有了, 既然他把信都收集起来, 那总归是要送出去的吧, 我就把送信的给包下来. 想到就做到, 第二天, 小王就去邮局谈这个事情, 经过一番协商, 将送往京津冀的信件包了下来.
包下来之后, 简单注册了一下, 小公司正式成立了. 先招个人来, 毕竟咱也是老板了. 招聘信息发出后, 第二天新员工小张就到了. 正式开工了.
王总: 小张, 去邮局把北京的信件拿回来
小张: 好嘞
没多大一会, 小张回来了, 还带回来了一堆信件
王总: 嗯, 不错. 再去把天津的信件拿回来吧.
这次, 一直等到第五天, 小张回来了, 同时也把信件带回来了.
王总: 小张, 怎么这么慢啊? 奖金还想不想要了?
小张: 没办法啊, 王总. 邮局那边的人说了, 没有信件, 就不让我回来.
王总: 但是已经有用户投诉了, 送往河北的信已经发出好几天了, 还没送到, 咱们想个解决办法吧.
小张: 王总, 既然这样, 那就只能在招人了, 一个人负责取一个地方的信件, 这样才能保证信件到了之后可以立马拿回来啊.
王总: 行吧, 这也是没有办法的办法了.
于是, 又招来了两个员工, 每个员工负责一个地区的信件, 不停的去邮局取信.
这就是最古老的版本了, 多线程阻塞式读取. 很显然, 耗费大量人力.
就这样过了两个月, 小王的业务是越做越大, 在原来京津冀的基础上, 又承包了内蒙地区. 所以, 需要为内蒙地区再招一个人进来. 王总是越想越不对劲, 那岂不是以后再扩展业务, 都要频繁的招人嘛? 不行, 我得找邮局聊聊. 于是, 王总找到了邮局局长.
王总: 局长, 听说我的人去邮局拿信, 没有信就不让人走? 这是什么道理?
局长: 什么? 还有这种事情, 王总莫急, 我回去问问.
王总: 那真是辛苦局长了.
这局长办事, 效率就是不一样, 第二天消息回来了. 以后邮局不许把收信的人扣下. 小王心中的小算盘得逞了. 你想啊, 原本需要4个人干的活, 现在一个人就干了. 只要不停的去邮局取信就行了. 小张跟自己的时间最长, 王总考虑之后, 还是决定把小张留下.
王总: 小张啊, 看你最近表现不错, 我决定工资给你翻一倍.
小张: 谢谢王总. 听说最近邮局出了新政策, 我每次取信的时候, 貌似都没有人留我了.
王总: 嗯, 没错. 经过我与邮局领导讨论, 决定废除之前留人的规定. 所以我决定公司取信的员工只留你一个人.
这下可把小张坑惨了, 他需要不停的取邮局取信, 不管有没有, 都要回来汇报一下, 然后继续去取下一个地方的信件.
但是公司现在只需要一个人就可以了, 嗯, 省钱.
这就是在之前基础上, 稍加改进之后的: 非阻塞式轮训读取.
最然公司现在只需要一个人了, 但是小张这每天跑来跑去的给累够呛. 现在是4个地方的信件, 全部拿回来, 小张就需要往邮局跑4趟, 本来一趟就能拿回来, 这不多此一举么? 费时费力的. 想到这, 小张发现了这个规则需要改进的地方, 但是他又不知道如何跟邮局高层反应, 只好告诉王总. 王总一听, 嗯, 有道理. 如果可以这样的话, 那拿信件的速度不就更快了么, 用户体验上更上一层楼啊, 得赶快落实下来.
王总: 局长啊, 我觉得现在的规定有些可以改进的地方.
局长: 嗯? 我觉得挺好啊, 有什么问题你说说看.
王总: 现在我们的人去取信, 每次只能取一个地方的信, 但是我承包了4个城市, 能不能取信的时候可以一次性把4个城市的信件都给我啊.
局长: 嗯, 你的建议很好, 不过我还要开会讨论一下.
王总悄悄的留下一个红包, 走了.
没过几天, 邮局传来消息, 王总之前提的已经下发了最新命令. 允许取信人批量获取.
从此, 从邮局取信更快捷了.
这就是「select」版本. 可以一次性批量向系统提出查询, 然后批量返回.
就这样又安稳的过了五个月, 随着业务的不断长大, 王总已经接下了全国40多个地区的信件. 但是随着地区的增加, 小张去取信的速度也变慢了, 王总心里不得劲了, 这个小张变的懒惰了, 回头要好好说说他.
王总: 小张啊, 公司慢慢壮大了, 怎么你取信的速度变得慢了不少, 倒也没见你信件多拿回来啊.
小张: 王总, 你是不知道. 每次我去取信, 都要邮局的人一个城市一个城市的找, 之前只有4个城市, 找的自然快. 现在几十个城市, 自然就变慢了.
王总: 嗯, 这倒是个问题, 那有没有什么好的想法呢?
小张: 王总, 其实我已经想过了. 现在我去拿信, 不光他们找的慢, 还可能找到最后一封信件都没有. 之前我一天可能要往邮局跑几百趟, 很多其实都没有拿到信件.
当时我就想, 如果每次等有信件了, 我再去拿, 那我就可以少跑几次了. 所以, 如果邮局那边有新的信件, 打电话告诉我一下, 然后我去拿回来就完美了.
王总: 嗯, 也好, 之前总让你跑, 确实不是个办法.
经过与邮局的一番协商, 这个新的方案再度落实了. 这次小张倒落得清闲, 有信件的时候就去拿, 没有的时候喝喝茶等着就是了.
从此, 王总的公司日渐壮大, 小张也平步青云.
这就是「epoll」版本, 将需要的数据绑定, 交由系统管理, 新消息是由系统通知