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



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

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

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

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

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

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

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

  3. 在集群的不同节点上运行所有任务。

还有什么想法和建议吗?

我们如何保证一个服务的故障不会影响到另一个服务?

你不能。当然,没有一个硬保证,和所有可能的故障模式。

例如,如果一种可能的故障模式是一个任务进入无限循环(或花费有限但非常长的时间),那么它将影响其他任务,除非您能够负担得起为每个任务专用一台独立的计算机(或者更现实地说,JVM)。

但是我们有一个问题,任务可能需要彼此交互,或者与共享数据库或其他东西交互。一旦包含了它,就会出现如下问题:

  • 持有锁时任务失败
  • 任务更新到一半失败
  • 任务失败,而其他任务正在等待消息,
  • 死锁和活动锁,
  • 影响计算节点子集的网络和硬件故障。
对于这些问题没有灵丹妙药。相反,您需要识别最常见的故障场景,并设计您的服务,以便它们能够(或多或少)恢复。设计一个系统也是一个好主意,如果有一个失败,你不必从头开始一切。

你提出的3个策略:其中任何一个都可能是合适的…根据任务的性质,以及其他应用需求

最新更新