【问题标题】:How far should I go to handle network problems in code?我应该走多远来处理代码中的网络问题?
【发布时间】:2012-06-18 22:20:05
【问题描述】:

我的客户端网络非常糟糕,包括网关映射错误和别名问题。有时他们会顺利运行几天,有时我们的服务会失败,因为它们无法连接到数据库或连接被神秘地断开。

程序(即服务)恢复或重试应该走多远?让他们的网络人员让它正常工作是否合理,还是我应该自己承担起它的脆弱性?

【问题讨论】:

  • 如果您需要额外的输入,我建议您看看这本书 Release It!由 Michael Nygaard 撰写,因为它包含很多关于如何在非最佳条件下(即现实世界)构建系统的好建议。
  • @BrianRasmussen - 我有这本书,非常棒。我正试图从堆栈溢出者那里得到一种感觉;我倾向于简单地失败并在必要时设置检查点以进行恢复。

标签: c# sql network-programming recovery


【解决方案1】:

1) 是的,期望他们的网络能够正常工作是合理的……你不会告诉别人他们买的车坏了,因为他们没有路可以开,对吗?

2) 也就是说:防御性编程。当您制造汽车时,您不能期望一切都是完美顺畅的州际公路。

更具体地说,我喜欢在我的系统中构建重试机制:我将在“可重试”逻辑中封装一些内容,让您可以指定重试次数。通常,重试周期将具有二次退避:例如,它在 n*n 秒后尝试,对于 1..n,其中 n 是重试次数,或者使用 fib(n),所以你有类似 1,1,2 的东西, 3.5 秒重试。回退有助于防止对上游资源造成不必要的压力

如果在设定的重试次数后,您可以抛出异常(可以捕获并通知用户或其他模块错误)或记录,具体取决于严重程度。

【讨论】:

  • 斐波那契也有指数增长。
  • 那个数列和斐波那契数列是二次增长,而不是指数增长。
  • 谢谢。但是,这不违反容错 - 更具体地说是“快速失败”的概念吗?
  • 不一定——单个模块可能会“快速失败”(例如,尝试检索网络资源)而不是等待资源可用。系统的其余部分会收到该故障的通知,并且某些故障处理系统会决定要做什么(重试、抛出异常)。
  • @ThomSmith, en.wikipedia.org/wiki/Fibonacci_numbers#Closed-form_expression 该公式在n 中是指数的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2013-02-21
  • 2011-11-11
  • 2013-08-15
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多