如何使我的应用程序的某些部分不依赖于另一部分的故障?

How can I make some parts of my application not dependent on failures of another part?

假设我们有几个服务,它们从不同的来源获取数据并以某种预定义的格式存储它。可能是他们将获取的数据存储在某个数据库、文件或其他地方。这个想法是所有这些服务都非常相似,但它们使用不同的来源。

在这些服务被分成几个 Java 应用程序之前。

现在我们想将这些服务整合到一个应用程序中以共享源代码并使其更简单。

一个问题是:我们如何保证一个服务的失败永远不会影响另一个?

我看到了几种可能的方法:

  1. 运行 所有任务在单独的线程中。不要共享一些可以被一个任务锁定的公共资源。缺点:内存问题没有得到缓解。

  2. 运行 所有任务在单独的 JVM 中。所有风险都降低了,但它更复杂,需要对主机进行更多配置。

  3. 运行 集群不同节点上的所有任务。最可靠但最耗资源和程序员时间的方法。

还有什么想法和建议吗?

How can we guarantee that one service's failure will never affect another one?

你不能。当然,没有硬性保证,并且有所有可能的故障模式。

例如,如果一种可能的失败模式是任务进入无限循环(或花费有限但很长的时间),那么这将影响其他任务,除非您有能力投入每个任务的独立计算机(或更现实地说,JVM)。

但是我们遇到了一个问题,即任务可能需要相互交互,或者与共享数据库或其他东西交互。一旦你包括它,你就会遇到这样的问题:

  • 持有锁时任务失败
  • 一个任务在更新某些内容时失败了
  • 一个任务失败,而其他任务正在等待它们的消息,
  • 死锁和活锁,
  • 影响部分计算节点的网络和硬件故障。

这些问题没有灵丹妙药。相反,您需要确定最常见的故障场景,并设计您的服务,以便它们(或多或少)能够恢复。设计系统也是一个好主意,如果出现故障,您不必从头开始一切。


关于您提出的 3 个策略:其中任何一个 可能 是合适的...取决于任务的性质和其他应用程序要求。