我目前正在处理非常大(单片)的Web应用程序。当模块/库/组件之一遇到某些问题时,我们经常会遇到问题,因为一个模块可能会使整个应用程序停顿。为了解决这个问题,现在每个人都建议采用微服务方式。
但是我想知道在微服务成为一种选择之前,如何处理类似的问题?即使我们决定采用微服务方式,这也将是一段漫长的旅程。在过渡时期我们该如何解决这个问题?
答案 0 :(得分:2)
如果将单片真正模块化,那么发生故障的模块不应使整个系统瘫痪。例如,这意味着每个模块都应具有自己的数据库。
良好模块化的另一个要求是,一个模块不应对另一个模块进行同步调用。如果一个模块需要其他模块的数据,则应在用户请求之外在后台进行。
多模块请求的聚合和编排应该在应用程序层中完成。例如,如果查询需要来自模块A和B的数据,则应用程序将子查询发送给A,然后将子查询发送给B,然后将结果合并并将响应返回给客户端。在此请求期间,A可能不会查询B,反之亦然。如果部分失败,则应用程序可能会返回部分响应或错误。
此外,您应该为每个模块都有一个监视解决方案。这是必需的,尤其是因为模块的后台任务可能会失败,并且您需要知道它们何时以及如何失败。
为此,我推荐这本书Release it。
P.S。您不需要为此而去微服务,设计良好的整体组件会更好。
答案 1 :(得分:1)
当模块/库/组件之一出现时,我们经常遇到问题 遇到一些问题,因为一个模块可以使整个模块停顿 应用。
这是因为所有这些模块在运行时都在同一进程下运行并共享资源。它们在运行时不是孤立的,并且可以通过设计(例如整体)相互影响。
您可以通过控制模块间的资源使用来最大程度地减少对模块的影响,例如,确保一个模块不会最终创建许多消耗资源的线程。监视模块之间的线程池和连接池。错误处理,以免影响跨模块。