首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速失败vs.健壮性

快速失败vs.健壮性
EN

Stack Overflow用户
提问于 2010-01-28 15:21:26
回答 8查看 719关注 0票数 17

我们的产品是一个分布式系统。我工作的模块相当新,相当严格,经过良好的测试。它们是在考虑到最近的最佳实践的情况下开发的。其他模块可以看作是遗留软件。

虽然我对我负责的模块中发生的一切保持警惕,但我经常面临处理从其他模块发送给我的坏数据的压力。本质上,我是一个“快速失败”的原则开发人员,因此,当问题出现时,我通常能够消除模块中出错的可能性。这不是关于责备,只是节省了在错误的地方追逐bug的浪费精力。

但我不断遇到的争论是:“我们不能让这个东西在生产中失败,客户希望它能工作,你为什么不解决这个问题”。这将是健壮性的一个论点:你接受的东西要自由,发送的东西要保守。

我还应该注意到,这些问题大多是间歇性的。我们在集成测试中看到了它们,但它们很难重现。这涉及到时间和并发性。

我很难在这两个原则之间取得平衡。部分原因是我担心,如果我开始允许和传播异常数据,我就会招致麻烦,我对我的系统就没有那么大的信心了。但是,即使其他模块发送给我错误的数据,我也不能反对保持系统正常工作。其他模块没有得到修复的原因是它们太复杂和脆弱,而我的模块看起来仍然清晰和安全。但是如果我不能抵抗压力,我的模块将会慢慢地背负同样的问题,我一直拒绝直到现在。

我应该说,系统在生产中没有“崩溃”,但我的模块可能只是向操作员显示错误,并要求他们联系支持人员。崩溃将是一个大问题,但如果我清楚地报告错误,那么这不是正确的做法吗?我怀疑我的同行只是不想让客户看到任何问题,就这样。但我的模块拒绝来自产品中其他模块的数据,而不是客户输入的数据。因此,在我看来,我们只是没有解决问题。

那么,我是需要更加务实,还是需要坚守立场?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-01-30 16:36:06

谢谢大家。引发这个问题的案例结束得很好,这在一定程度上要归功于我从上面的答案中获得的见解。

我最初的反应是坚持快速失败,但我进一步思考了这一点,并得出结论,我的模块的角色之一是为系统的其余部分提供稳定的锚。这并不一定意味着接受坏数据,而是要浮出水面,隔离它们,以透明的方式处理它们,直到我们找到解决方案。

我计划为这个案例添加一个新的处理程序和代码路径,它将正确地执行,就像它是一个以前没有文档记录的特殊用例一样。

我们进行了一次讨论,我重申有必要处理边界问题,但也愿意提供帮助。我向对方概述了我的计划,因为我怀疑我的立场被认为过于书生气,解决方案被认为是我只需关闭无害数据的虚假验证,即使它是不正确的。但实际上,我的工作方式很大程度上是数据驱动的,所以我解释了为什么它必须是正确的,行为是如何由它驱动的,以及在容纳这些数据时,我将如何实现特殊的代码路径。

我认为这让我的立场更有分量,并导致了对另一方反对操纵数据的更彻底的讨论。事实证明,处理一个容易出错的遗留系统比处理实际的障碍更令人厌倦。有一个相对简单的解决方案,只是做出改变是可怕的,一种相当根深蒂固的心态。

但在提出了所有挑战和可能的解决方案后,我们最终同意修复数据,到目前为止,它似乎已经解决了我们的问题。我们的集成测试现在一致通过,但我们还添加了日志记录,并将继续监控它。

总而言之,我认为,对我来说,这两个原则的综合是快速失败是浮出水面的关键。但一旦它们浮出水面,健壮性意味着提供一条透明的路径,以不损害系统的方式继续运行。我能够提供这一点,通过这样做,赢得了另一方的一些好感,并最终修复了数据。

再次感谢每一个回复的人。我太新了,不能给评论打分,但我真的很欣赏大家提出的所有观点。

票数 1
EN

Stack Overflow用户

发布于 2010-01-28 15:44:35

我赞同“快速失败”的偏好/原则。不要认为这是原则上的冲突,这更多的是理解上的冲突。你的对手有一些不言而喻的要求(“不要向用户显示一个糟糕的时间”),这意味着一些遗漏的需求。您事先没有机会考虑/实现这个需求,所以这个需求给您留下了不好的印象。忘记这个观点,把它重新当作一个新项目,有一个固定的需求,你可以针对它工作。

也许最好的结果是像您显示的那样给出一条错误消息。但这听起来像是你在得到对方的认可之前就实现了它,当他们可以选择接受它的时候。早些时候关于你正在做什么的交流可以解决类似的问题。

在如何阻止这些想法时要小心。不断提到其他系统“太复杂和脆弱”可能会触怒人们。简单地说,这些系统对你来说是新的,需要更长的时间才能理解。一定要花时间去理解它们,这样你就不会降低人们对你能力的期望。

票数 4
EN

Stack Overflow用户

发布于 2010-01-28 15:30:29

我想说,这取决于如果你不停下来会发生什么。有人的薪水被错误处理了吗?是否发出了错误的订单?这将是值得停下来的。

如果可能的话,吃你自己的蛋糕-不要向用户报告错误,让客户同意发送诊断报告,并报告每个故障。对拥有故障模块的开发人员进行Bug以修复它们。我说的bug指的是向他们提交一个bug。或者,如果管理层认为不值得花费修复成本,就不要这样做。

我还会针对那些失败的模块编写单元测试,特别是如果您能分辨出导致它们生成错误输出的原始输入是什么。

然而,真正归结为评估你的表现的人希望你做什么,特别是在你通过电子邮件向他们解释了问题之后。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2152912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档