【问题标题】:How to build scalable multi-application with ability to scale up certain app components?如何构建具有扩展某些应用程序组件能力的可扩展多应用程序?
【发布时间】:2018-08-16 02:19:32
【问题描述】:

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

典型用例 - 服务:

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

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

【问题讨论】:

    标签: java spring docker architecture scalability


    【解决方案1】:

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

    您更喜欢哪种基础架构?

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

    是否必须复制存储空间?

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

    负载平衡

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

    Docker

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

    微服务

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

    总结

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2011-08-06
      • 2010-10-29
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多