对于一个传递链,不管是同步还是异步流水线,其中每个角色都需要从上游角色接收物品/消息,以及向下游角色传递物品/消息。具体如何传递?如果是实际产品包装流水线的话,那么不可能是用手去传递的,我处理完用手递给你,除非离得近,以及每次你都能在我胳膊发酸之前接过去。更方便的做法是,我将处理完的物品放到一个你我都可以方便摸得着的地方,比如一个工作台上,我只要放上去就行了,根本不用管下游操作者处于什么状态。只要大家都在全速工作,不出什么问题的话,我下一次打算往上放东西的时候,会发现原来那件物品总是能被及时的被下游操作者拿走。
然而,不能保证总不出问题。比如下游操作者突然走神了,没来得及拿走上游放在工作台上的物品,则上游打算传递下一个物品的时候,就会停住,同时也不再继续从它自己的上游那里拿走待处理物品,这会一层层反馈到源头,导致传递链停顿,或者叫Stall,阻塞。
厂长一看急了,这不行,动辄就停顿,太影响生产效率。那么你认为厂长应该如何解决这个问题?估计你也想得出来,那就是把工作台面拉长一些,弄个传送带和挡板,上扔过来的物品被源源不断传送过来(假设传送带速度非常快,忽略物品在传送带上传输的时间),并且堆积在处于下游较色眼前的挡板处。如果大家全速运行,那么任意时刻挡板处最多只有一件物品出现。一旦下游由于各种原因处理速度变慢,或者瞬间有卡顿,那么上游依然可以往传送带上放置处理完的物品,此时会发现下游的挡板处有物品堆积,下游卡顿时间越长,堆积越多,如果一直堆积到上游跟前,那么上游就知道传送带已满,就会停止处理,同理,上游的上游的传送带就会逐渐堆积,一直反馈到源头,最终导致卡顿的那个人之前的所有人都停止处理,但是卡顿的人和其下游的人会继续处理。当上游发现传送带上有空余位置的时候,就继续处理并向上放置物品,逐渐恢复流水线的运行。下游此时可以一过性加快处理速度,将传送带上的物品加速消耗,传送带中物品堆积数量越来越少,最终少到1的时候,可以恢复原来的处理速度。或者下游继续按照原有速度处理,那么此时就会在传送带上永久积压着满传送带的物品,除非源头不再有物品需要处理。
这样做的好处是将流水线上的每个工序解耦,从紧耦合变为松耦合。其本质上是在每两道工序之间加大了缓冲空间,之前缓冲空间只有1,相当于没有缓冲。至于这个缓冲空间需要有多大,一般取决于该队列下游工序的处理速度,越快,则相应的应当增加上游缓冲的空间,这样的话上游可以向该缓冲空间内存放大量的物品,以供下游角色消耗,一旦上游出现瞬间卡顿