互联网上对于冗余的专项研究寥寥,然而无论是产品使用流程规划还是系统设计,冗余都应该成为一种思考的尺度和方式,帮助我们做出更好的选择。
什么是冗余?
维基百科中冗余的定义是:
系统为了提升其可靠度,刻意配置重复的零件或是机能。
冗余是系统视角中才有的独特概念,冗余无法单独存在。如我们可以说数据异地备份是数据存储系统的冗余设计,但是不能说数据存储在 3 个不同地理位置的机房是冗余。
我对于冗余的兴趣,最早来自学校的打印店。很多大部头的书或者论文(虽然很多文字是无意义的废话)打印出来进行热胶装。由于纸张没有办法十分精准地对齐,打印店通常都会用一个机器裁切:将装订好的书本放进去,然后调整好尺寸,之后师傅双手需要同时按住位于机器左右两侧的按钮,铡刀才会下来将书本裁剪整齐。
从机械设计来说,一个按钮也可以实现闸刀的起落,因此起初我以为是机器型号所导致的按钮设置,直到我写了更多无用的长篇论文,在不同打印店里见证了一次又一次铡刀的起起落落,才发现按钮在机器的两侧其实是一种标准设计。
原因很简单:安全——只有两只手同时按下操纵按钮,铡刀才会启动,保证锋利的铡刀不会伤害到人手。
很多公司的热饮水机也加入了类似的冗余设计:如果想要出热水,需要额外按住一个功能键,以防止误操作导致被烫伤。
今年受疫情影响,我们在家里办公了很长一段时间。为了保证每位员工没有在家划水,老板开始要求每天写日报、每天开晨会同步当天工作内容与进展。从公司运行系统来讲,晨会和日报的制度,也是在 KPI、双月绩效之外的一种冗余设计。
所以,我又重新激发了对于冗余的兴趣,特别感兴趣的是冗余的必要性,以及它与效率之间的关系。
冗余设计
只要仔细观察,你会发现冗余在生活、工作中无处不在,甚至在人的身体器官中,眼睛、耳朵等器官的双备份机制也是一种冗余机制,保证人体的正常运转。
工程中的冗余设计
冗余设计在工程中应用非常广泛。
今年 3 月,旗下的猎鹰 9 号成功发射,但是回收失败,因为在发射过程中,猎鹰 9 号的其中 1 个发动机爆炸,得益于猎鹰 9 号动力系统的冗余设计,火箭上共有 9 台发动机,其中 1 台发生了爆炸之后,其他发动机继续正常工作,才保证卫星正常进入轨道中。
图片源自网络
在航天飞机中,冗余设计更是随处可见。引用一篇介绍 NASA 冗余设计的文章:
航天飞机……而是依靠四台独立的计算机运行相同的导航和制导软件,并接收相同的数据输入。这四台计算机作为民主的缩影而运作。它们中的三台计算机必须就它们所衡量的内容达成共识,才能采取行动。
如果三台计算机同意,而第四台计算机不同意,那么出现这种情况宇航员就会关机或重新启动它。这就使得避免灾难或代价高昂的停顿所需的快速决策成为必要。如果多台计算机出现故障,或者无法达成共识,那么一台同样可以访问航天飞机控制系统的额外计算机就可以接管。它可以进行预编程的粗略(但安全)的上升、中止和再入。
——InfoQ. 在太空里不惧宕机,NASA是怎么做到的?
制度设计中的冗余
高中学习宋史时,都会频繁提及“冗官”、“冗兵”、“冗费”的“三冗”。据资料:
北宋官吏2.4万人,是唐朝的1.28倍;每10万人中平均拥有的官吏数是51人,不仅超过唐朝的35人,也超过元(27人)和明(37人)。
——刘笃才&杨一凡:论北宋的冗官问题
造成官吏冗余的重要原因一方面是大量恩荫制度造成的官员累积,更重要的是为了分散权力,设置了诸多机构,如中央将宰相权力一分为三,在地方设置通判分割行政权,又设置转运使和按察使分割司法权。此外,宋朝官制中官、职、差遣三者分离,官制职能重叠,难免导致冗官,特别是在宋朝后期。
我们部门设置的晨会+日报机制,本质上也是一种制度冗余。虽然我很厌倦晨会,但是一想到第二天要在晨会上说点什么,今天总得写一点什么、做一点什么,即使是“面向晨会”的工作,也总是逼迫着自己有一些产出。最初我们的晨会开的像周会,每次能开 1 个多小时,导致大量时间被浪费。
不是所有的制度冗余造成的结果都是负向的。例如在我国,机场塔台管制员实行双岗制,一个是主管制员,直接指挥飞机,另一位则是助理管制员,负责监听与监督,当主管制员发出的指令有误时,助力管制员需要及时提醒与纠正,两人共同决策。通过两个人的决策,减少因决策失误导致的事故发生的可能性。
实际上,2016 年上海虹桥机场两架东航飞机险些相撞的事故,事后调查认为差点酿成悲剧的原因,双岗制落实不到位被重点提出来。
冗余机制
如何设计冗余?
主动冗余与被动冗余都是常见的冗余机制设计。
主动冗余指的是系统自动监控运行,一旦检测到某个设备损坏,则会调整系统配置切换到正常设备上。例如 GPS 定位系统中除了 24 颗在轨的卫星,还有 3 颗备份卫星,一旦某颗卫星“寿终正寝”或者突发故障而导致不能工作,则可以由备份卫星及时顶上。在主动冗余系统中,系统必须实现错误检测、隔离重配置的自动化。
公开报道中,Google 的无人车在电源、定位测量、转向、制动和计算系统中均有主动冗余设计,一旦某个子系统出现某个问题,系统会自动切换到备用系统中,以最大程度保证安全。
被动冗余则是通过多余的设备或能力,来减少某个零部件损坏引发的损失。如在设计桥梁拉索的承重能力的时候,一般都会在要求之上再加一些额外的承受能力。再比如你在今晚 6 点钟跟别人有一场重要的约会,通常你不会根据地图估算的时间掐点到,而是会充分考虑堵车、等车额外需要花费的时间,多拿出半个小时的时间作为备用。
N 模块冗余(N Modular Redundacy):通过 N 个系统对同一个输入进行计算,比较输出的结果,对结果进行投票,取大多数的输出为最后的输出。
常见的为三重模块冗余:如果 3 个系统计算的结果不一致,取 2 个一样的结果为最后输出。
冗余与安全
冗余一般为安全而设计,例如上文提到的机场塔台双岗制,然而随着系统复杂性提高,冗余让系统复杂性提高,反而可能会产生意外的错误,特别是冗余中有人的因素的时候,发生错误的概率也会提升。
1929 年,美国三哩岛核电站发生核泄漏,是美国商业核电史上最严重的的一次事故,虽然没有对公共安全和周围居民健康造成不良影响,但核污染的清除,总共花了 14 年的时间与 10 亿美元的代价,更重要的是,美国商业核电站陷入长期低迷中。
2 号机组反应堆冷凝水泵突然故障,反应堆中热量堆积导致堆芯压力上升,此时备用水泵按照程序应该启动,替代故障水泵完成冷却水的供水,然而备用水泵没有按照计划启动,因为前两天的一次检修中,辅助给水系统中隔离阀没有按规定打开,导致备用给水系统没有任何反应。整个事件处理过程中,加上一些人为的错误,差点导致堆芯熔毁和放射性物质逸出。
虽然经过 15 个多小时的奋力抢修,反应堆才幸免于难,然而迫于公众压力,时任总统卡特宣布“美国不再建设核电站”,直到近 30 年之后奥巴马时代才重启核电站项目。
冗余设备让人放松警戒,可能会引发更大事故。典型的如特斯拉的自动驾驶系统,让人误以为是安全的,很多事故中司机手离开方向盘,将所有决策交给 Autopolit,最终导致交通事故的发生。
所以业内一直在争论:到底是 L3 级别的辅助驾驶更安全,还是 L5 级别的完全无人驾驶更加安全。L3 级别的驾驶,还没有达到完全自动的状态,但是让司机误认为可以将决策交给自动驾驶系统,或者由于自动驾驶系统的存在降低了注意力,最终导致事故的发生。
冗余与效率
直觉上,冗余设计似乎与效率相背而行,但是在一个完整的系统下考虑,一定程度的冗余可以保证系统的稳定性与可靠性,减少因为错误导致系统宕机的概率,从而提升效率。然而凡事“过犹不及”,一味追求稳定性而增加冗余设计,最终也会损伤效率。尽管没有明确度量冗余、效率的指标,如果将冗余和效率分别放在横纵坐标上,画出来的一定又是一条“微笑曲线”。
删除是我们在产品设计中的常见功能之一。一般而言,删除之前会通过一个弹窗的形式进行二次确认,避免用户操作失误导致的误删除。然而,我们也见识过PC端各类杀毒软件的全家桶,除了各种捆绑下载、后台静默安装之外,卸载操作时反复确认操作、增加用户的卸载成本,也是让人厌恶的骚操作。
互联网上对于冗余的专项研究寥寥,然而无论是产品使用流程规划还是系统设计,冗余都应该成为一种思考的尺度和方式,帮助我们做出更好的选择。
作者:余子申;公众号:简写2019