即使其中一个组件不工作,如何保持整体系统正常运行?

时间:2018-10-17 04:13:08

标签: design-patterns architecture microservices soa production-environment

我目前正在处理非常大(单片)的Web应用程序。当模块/库/组件之一遇到某些问题时,我们经常会遇到问题,因为一个模块可能会使整个应用程序停顿。为了解决这个问题,现在每个人都建议采用微服务方式。

但是我想知道在微服务成为一种选择之前,如何处理类似的问题?即使我们决定采用微服务方式,这也将是一段漫长的旅程。在过渡时期我们该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果将单片真正模块化,那么发生故障的模块不应使整个系统瘫痪。例如,这意味着每个模块都应具有自己的数据库。

良好模块化的另一个要求是,一个模块不应对另一个模块进行同步调用。如果一个模块需要其他模块的数据,则应在用户请求之外在后台进行。

多模块请求的聚合和编排应该在应用程序层中完成。例如,如果查询需要来自模块A和B的数据,则应用程序将子查询发送给A,然后将子查询发送给B,然后将结果合并并将响应返回给客户端。在此请求期间,A可能不会查询B,反之亦然。如果部分失败,则应用程序可能会返回部分响应或错误。

此外,您应该为每个模块都有一个监视解决方案。这是必需的,尤其是因为模块的后台任务可能会失败,并且您需要知道它们何时以及如何失败。

为此,我推荐这本书Release it

P.S。您不需要为此而去微服务,设计良好的整体组件会更好。

答案 1 :(得分:1)

  

当模块/库/组件之一出现时,我们经常遇到问题   遇到一些问题,因为一个模块可以使整个模块停顿   应用。

这是因为所有这些模块在运行时都在同一进程下运行并共享资源。它们在运行时不是孤立的,并且可以通过设计(例如整体)相互影响。

您可以通过控制模块间的资源使用来最大程度地减少对模块的影响,例如,确保一个模块不会最终创建许多消耗资源的线程。监视模块之间的线程池和连接池。错误处理,以免影响跨模块。