如何构建可扩展的多应用程序,能够扩展某些应用程序组件?

时间:2018-03-07 20:59:10

标签: java spring docker architecture scalability

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

典型用例 - 服务:

  • 1x Service A
  • 1x服务B
  • 2x Service C
  • 2x服务D
  • 5x Service E

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

1 个答案:

答案 0 :(得分:1)

这是一个非常普遍的问题,根据您的应用程序,有很多种方法。我将尝试回答一下有关复制和云基础架构的一般想法。

您更喜欢哪种基础设施?

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

您是否需要复制存储空间?

在运行多个"无状态"的实例时应用程序服务非常简单,跨多个节点共享数据库更加困难。您可以拆分数据存储(例如,组a的用户在节点a ...上)或者必须将数据库中的每个更改复制到所有节点(如果您有许多写入会降低性能)

负载平衡

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

<强>泊坞

通过对基础架构的每个元素进行docker化,您通常可以获得可扩展性。每项服务例如你的java后端,数据库,负载均衡器......应该是docker化的。关键问题是您可能需要复制的存储空间。

<强>微服务

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

<强>摘要

从我的角度来看,如果你想避免aws&amp; co,首先要在同一节点上启动同一个数据库的所有服务。例如。使用应用程序服务在同一节点上运行sql或nosql db。使用像nginx这样的负载均衡器将所有请求路由到您的节点。使用docker卷对所有内容进行Docker化并装入数据。如果您获得了限制,请升级您的硬件。如果这不适合使用kubernetes。