曾遇到一个很有意思的问题,当时给出了一个回答:
https://www.zhihu.com/question/392259415/answer/2385499293
今天正好五一假期又出不去,把答案再深入细化一下。
首先声明,我不是搞生物医学的,甚至连爱好都算不上,我是一个搞网络传输的普通工人,以系统设计的视角来瞻仰人体之妙。
下图是一个简单的循环系统图示:
很明显,唯一的心脏是以串行泵血的方式工作的,而肺泡却是多实例并行,多个肺泡组成一个肺叶,理论上肺叶的数量可以超过两个,为什么会这样呢?
如果不这样,假设心脏可以有两个,将会面临下面的问题:
两个心脏没能带来任何收益,反而带来了开销。无论full mesh还是并行,细胞物质交换同步,血量血压同步开销均过大。
既然心脏不能多实例负载均衡,可以Active-Standby方式热备份两份吗?
依然是开销过大。人体活在生物圈中,需要从生物圈获得能量维持能耗,热备一套不工作的系统就是净损耗,不如对危险进行主动防御,比如把心脏放在有坚固骨骼保护的胸腔内部防御外部伤害,如果还不行,不如挂了更划算。
以供氧为例,氧气作为Data,二氧化碳就是ACK。TCP协议栈的设计应该是人体循环系统的样子,如此才能实现真正的全双工,现如今的TCP实现都是半双工的,socket接口也是半双工的,需要改。
我说的是TCP协议栈的端到端实现,并不包含拥塞控制,我在循环系统没能找到拥塞控制的对应,循环系统经不起拥塞,血管堵了是很可怕的,系统几乎直接崩溃。循环系统不需要复杂的拥塞控制,它不允许拥塞,因为它完全是全局同步的心跳时钟驱动的,Pacing固定,所以天然避免了拥塞。
循环系统的分散聚集节点很有意思,它依靠反压来决策流入某个分支的血量,这是一个天然的流体渗透模式的传输。TCP对此是天然抵触的,我一直觉得以流体渗透模式多路径并行传输,最终接收端重组是一个非常可行的策略,但很多人并不理解我在说什么。
如果真有设计者,我不晓得人体的设计是基于性能考量,还是基于成本考量,但无论如何,我们设计的任何系统难道不也是基于这两个考量的吗?可人们偏偏关注性能而不是成本,这是误区,我以为。
性能优化可立竿见影,成本则是秋后算账。你选哪个?
下面的段落基于原答案修改:
原答案
这是一种trade-off,同时体现了负载均衡(active-active)和热备(active-standby)的差异。
凡是持续工作,且不需互相同步的器官,都可以多实例负载均衡,也就是双份甚至多份,比如肾,肺,耳,眼,鼻孔(耳,眼,鼻是接收信息的读端,无需互斥,所以可以负载均衡,类似读写锁的读),四肢(甚至4个);
凡是持续工作,但需要同步的器官,都只有一个,比如心脏,嘴(两个嘴同时吃饭,总有一个里面的饭先下去,同时说话,又是一个难题,嘴是发送信息的,耳,鼻,眼是接收信息的,读可以同时,写只能互斥,嘴巴类似读写锁的写);
凡是不需要持续工作的器官,一律只有一个,比如消化系统中的胃,肝,胆。
大脑是经理,太复杂,左右半球以及其内部分工也不是很懂,略。
如此设计效能最高。
心脏出问题的概率很低,相比两个心脏同步或供养一个热备心脏的开销,挂了更划算。生物可以进化出更划算的策略来容错。
当然,事无绝对,人体的bug本来就很多,食管气管交叉,智齿,椎间盘,都直立行走了还必须躺着睡觉,拉屎,ml对动作有要求,太麻烦…此外,故意留一些bug,故意一次不把事情做完,有利于保住饭碗,如果我们也是被设计出来的话,设计师肯定也明白这些道理。
浙江温州皮鞋湿,下雨进水不会胖。