0

我正在阅读 Cloud Foundry 中 Side Car 和 Multi Process Application 的概念。

  1. https://docs.cloudfoundry.org/devguide/multiple-processes.html
  2. https://docs.cloudfoundry.org/devguide/sidecars.html

我有几个我自己无法弄清楚的问题。

Q1:何时使用带有 Sidecar 的 CF 应用程序与何时使用带有进程的 CF 应用程序

sidecar我知道vs之间的主要区别multiple process application与容器有关。Sidecar 进程在同一个容器中运行,而对于多进程应用程序,它们都在单独的容器中运行。

我无法弄清楚,我们应该在哪些场景中使用sidecar与我们可以在哪些场景中使用multiple process application

Q2:不同工艺的不同工艺

在一个应用程序中multiple processes,如果我想以 2 种不同的技术运行 2 个进程(Java 中的一个进程,Go 中的另一个进程 / 其他任何进程),该怎么做?当我看到buildpack配置与.application而不是process. 所以我的印象好像只有所有进程必须采用相同的技术(或者我们可以在这里提供多个构建包?)。

manifest.yml这是我正在使用的示例:

applications:
  - name: multi-process1
    disk_quota: 1G
    path: target/SampleApp-1.jar
    instances: 1
    memory: 2G
    buildpacks:
      - java_buildpack
    env:
      CONFIG_SERVER_PORT: 8080
    processes:
      - type:  'task'
        command: '$PWD/.java-buildpack/open_jdk_jre/bin/java -jar $PWD/BOOT-INF/lib/mycustomlogger-1.jar'
        memory: 512MB 
        instances: 1
        health_check:
          type: http
          
      - type:  'sampleProcess2'
        command: '$PWD/.java-buildpack/open_jdk_jre/bin/java -jar $PWD/BOOT-INF/lib/mycustomlogger-1.jar'
        memory: 512MB 
        instances: 1
        health_check:
          type: http    
          
      - type:  'web'
        #command: '$PWD/.java-buildpack/open_jdk_jre/bin/java  $PWD/BOOT-INF/classes/com/example/SampleApp'
        memory: 1G 
        health_check:
          type: http   

Q3:交互过程

在这种情况下,一个进程如何与应用程序中的其他进程调用/交谈/交互。这里有哪些可用选项?我找不到任何演示应用程序中多个交互过程的示例,任何示例都会非常有帮助。

Q4:多目标应用程序与多进程应用程序之间的区别

我遇到了一个名为Multi Target Application,参考的概念:https ://www.cloudfoundry.org/blog/accelerating-deployment-distributed-cloud-applications/

我在标准 Cloud Foundry 中没有发现这种可能性,但我觉得它可能与 Multi Process 应用程序“相似”(因为它们在独立容器上运行并且不会相互影响)。我的问题是:

  • Multi Target Application vs 和有什么不一样 Multi Process Application
  • 构建多目标应用程序的基本 Can Foundry 概念是什么?

任何指导将不胜感激。

4

1 回答 1

1

Q1:何时使用带有 Sidecar 的 CF 应用程序与何时使用带有进程的 CF 应用程序

当您拥有分离良好的应用程序时,不同的流程类型会很有帮助。他们可能会互相交谈,他们可能会交互,但这是通过某种已发布的接口(如 REST API)或通过消息队列完成的。

一个典型的例子是工作队列。您可能有一个进程正在运行您的 Web 应用程序并处理流量,但如果有一个大工作出现,那么它将指示一个单独运行的工作进程来处理该工作。这通常通过消息队列完成。优点是您可以单独扩展每个。

使用边车,它们处于相同的过程中。这适用于需要两个或多个进程之间紧密耦合的场景。例如,如果您需要共享相同的文件系统,或者如果您有拦截流量的代理进程。

这两个过程通常以串联缩放的方式联系起来,即过程之间存在一对一的关系。这种关系是必要的,因为如果您扩大应用程序实例数量,您将同时扩大两者。您无法独立缩放它们。

在具有多个进程的应用程序中,如果我想以 2 种不同的技术运行 2 个进程(Java 中的一个进程,Go 中的另一个进程 / 其他任何进程),该怎么做?

你是对的。您需要依赖多构建包支持。

您的应用程序仅暂存一次,并且会生成一个液滴。每个过程都是从同一个液滴中旋转起来的。您需要的一切都必须内置到那个液滴中。因此,您需要将所有内容推到一起,并且需要运行多个构建包。

在您的 manifest.yml 中,该buildpacks条目是一个列表。您可以指定要运行的构建包,它们将按该顺序运行。

或者,您可以预编译。如果你使用 Go。交叉编译通常是微不足道的,因此您可以提前编译并推送您使用应用程序生成的二进制文件。

在这种情况下,一个进程如何与应用程序中的其他进程调用/交谈/交互。这里有哪些可用选项?我找不到任何演示应用程序中多个交互过程的示例,任何示例都会非常有帮助。

我将把它分成两部分:

如果您谈论的是作为 sidecar 运行的应用程序,这取决于 sidecar 的功能,但您可以选择。基本上,你可以在 Linux 环境中做的任何事情,记住你是以非 root 用户身份运行的,你都可以做。通过共享文件/文件夹进行协调,拦截网络端口和代理到另一个端口或其他ipc

如果您正在谈论多个进程(CF 术语),并且每个进程都在一个单独的容器中运行,那么您的限制会更大。您需要使用一些外部方法进行通信。这可以是服务代理、数据库(不推荐)或 API(Rest、gRCP 或 rsocket 都是选项)。

请注意,这种“外部”通信方法不一定需要公开,只需要在容器外部即可。你可以使用像代理/数据库这样的私有服务,或者你可以使用内部路由和容器网络

Q4:多目标应用程序与多进程应用程序之间的区别

抱歉,我不确定这个。多目标应用程序不是 CF 中的核心概念。我把它留给其他人来回答。

于 2022-01-09T01:02:36.510 回答