如何构建具有扩展某些应用程序组件能力的可扩展多应用程序?

How to build scalable multi-application with ability to scale up certain app components?

我正在构建应用程序 (Java、Spring),它从单个数据库读取 "services" 列表,然后监听单个 REST 端点和指定的 运行s单个工作线程中的服务(取决于请求参数)。我可能还想 运行 某些 "services" 在更多实例上,有些只在几个实例上,因为有些服务可能被大量使用,有些则没有。我的目标是通过 docker 复制使这个应用程序具有可扩展性。

典型用例 - 服务:

如何构建这样的系统,能够在节点之间平衡服务?

这是一个非常笼统的问题,根据您的应用,有很多方法。我将尝试用一些关于复制和云基础架构的一般想法来回答它。

您更喜欢哪种基础架构?

  • 商业云(aws、google、...)为您提供一切(负载平衡、复制)
  • 在您自己的硬件上使用 kubernetes 让您有机会定义在不同节点(服务器)上应该 运行 多少服务,以及在不同节点上共享数据存储的可能性
  • 您可以实施自定义解决方案

是否需要复制存储?

虽然 运行"stateless" 应用程序服务的多个实例很容易,但跨多个节点共享数据库却比较困难。您可以拆分您的数据存储(例如,组 a 的用户在节点 a 上...)或者必须将数据库中的每个更改复制到所有节点(如果您有很多写入,这会降低您的性能)

负载均衡

如果您有多个节点,您应该使用负载均衡器(例如 nginx 实例),它是每个没有应用程序逻辑但将请求路由到正确服务的请求的入口点。对于实例化服务,负载均衡器可以均匀地路由请求,例如使用随机函数或通过了解每个节点的工作量(因此每个节点都必须提供其工作量)。如果你想动态处理它,每个服务都应该有一个路由来检测工作负载(例如 /status),或者你需要一个像 cadvisor 这样的工具来检测节点的使用情况。也许 kubernetes 是更好的解决方案。

Docker

通过 docker 化基础架构的每个元素,您通常可以很好地获得可伸缩性。每项服务,例如您的 java 后端、数据库、负载平衡器...应该 docker 化。关键问题又是您可能必须复制的存储。

微服务

一种非常流行的模式是微服务。每个服务都遵循关注点分离模式。你不会有大数据库,因为每个服务都有自己的相当小的数据库。另一方面是通信开销,如果它需要来自另一个服务的数据,它将通过服务间请求请求它(因此你必须实施严格的安全策略,例如 jwts)

总结

从我的角度来看,如果您想避免 aws&co,我会首先在同一节点上启动具有同一数据库的所有服务。例如。 运行 您的 sql 或没有 sql 数据库与其应用程序服务在同一节点上。使用像 nginx 这样的负载均衡器将所有请求路由到您的节点。 Docker利用 docker 卷装载所有数据。如果您获得限制,请升级您的硬件。如果这不适合使用 kubernetes。