春节期间河南穷游屡次加油站排队加油之启示。
不考虑有意的设计因素,汽车加油口概率性分布在车身的左边或者右边,这个偶然的小细节让加油机同时为两辆车加油而无需额外的加油管。
如果所有车辆加油口都在同一侧,加油站的加油机就只能给一边的车加油,高峰期容易造成拥堵,加油效率低下,或者加长一根加油管,用飞线的方式跨过紧靠加油机的车辆为远离加油机的车辆加油,资源浪费。加油口分设在左右两侧,能让车辆从不同方向停靠加油机,加倍了加油站吞吐,提高加油效率。
类似的例子还有多侧开门的电梯,这让楼层布局摆脱了电梯井的位置约束,从而可以设计出更加多样性的楼层布局,设电梯的四边门编号为 1,2,3,4,比如经理在大厅从电梯 1 号门进入,到达目标楼层可以从背向的 3 号门走出,这就允许目标楼层在任何方向敞开,大大缩短了穿皮鞋走路的距离。
比如港口,煤矿,油田装货卸货设施,远距离输电设施等,均有类似的小细节,但由于这些设施与大多数人日常生活无关,这类例子不再赘述。
所有类似设计背后的哲学很简单,就是对称性。增强对称性就意味着高性能,反之则意味着高稳定。
在设计传输协议时,有单接收 buffer 和多接收 buffer 之选择,显然 TCP 是单 buffer。类比加油站,装卸货等设施,如果新的传输协议同时使用两个或更多 buffer,将会高尚。
当数据到达时,接收例程选择一个没有被进程上下文 lock 的 buffer,将数据 queuing,随后携带若干 buffer 共同维护的共享接收状态返回 sender,这些状态或许是一个 bitmap,或许是 SACK 链,这些不重要。这种方式摆脱了 TCP 串行接收的约束,除非所有 buffer 均被 lock,否则不必将 data 放入 backlog。这种方式解耦了接收和包括可靠和保序之类的处理,当然,如果你的协议是尽力而为的,把处理逻辑留空,pass through 即可。
如果在用户上下文自行处理可靠,保序等逻辑,可想而知只有一个或至多线程数量的 buffer 被 lock,只要 buffer 数量足够多,接收上下文总能 queuing data,这才是真正的样子。
这将极大提高传输吞吐。因为我们知道,制约吞吐的大障碍就是串行化,之所以必须串行化,其原因是可靠性处理,然而处理可以拨离到单独的上下文,与接收上下文流水线化,这种表象化的思路背后就是加层解耦,但实质则是对称化。
再回到加油站。
也许加油口的位置设计与左舵右舵有关,如果加油口固定在左侧,靠右行驶的车辆靠路边加油没问题,而靠左行驶的车辆只能在中间岛加油,为统一加油站的设施规格,加油口就得置于右侧。这些约束太严格了,但在加油站内部,松散约束并没什么大问题,这是独立的上下文,与上路情形的规则完全解耦,因此,只要在加油站内部同时允许靠左,靠右行驶就行了。
浙江温州皮鞋湿,下雨进水不会胖。