关于具有多个进程的 Cloudfoundry 应用程序的问题

Questions regarding Cloudfoundry Application with multiple Processes

我正在阅读 cloud foundry 中的 Side Car 和多进程应用程序的概念。

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

我有几个问题是我自己弄不明白的。

问题 1:何时使用带有 Sidecar 的 CF 应用程序与何时使用带有进程的 CF 应用程序

我了解到 sidecarmultiple process application 之间的主要区别与容器有关。 sidecar 进程 运行 在同一个容器中,而对于多进程应用程序,所有进程 运行 在不同的容器中。

我无法弄清楚,在哪些情况下我们应该使用 sidecar 与在哪些情况下我们可以使用 multiple process application

Q2:不同技术的不同流程

在具有 multiple processes 的应用程序中,如果我想 运行 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:交互过程

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

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

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

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

任何指导将不胜感激。

Q1: When to use a CF Application with Sidecar vs when to use a CF Application with Processes

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

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

有了sidecar,他们在同一个进程中。这适用于需要两个或多个进程之间紧密耦合的场景。例如,如果您需要共享同一个文件系统,或者如果您有拦截流量的代理进程。

这两个进程通常以串联缩放的方式联系在一起,即进程之间存在一对一的关系。这种关系是必要的,因为如果您扩展应用程序实例计数,您将同时扩展两者。您不能单独缩放它们。

In an application with multiple processes , if I want to run 2 processes in 2 different technology ( one process on Java another process in Go / anything else), how to do so ?

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

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

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

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

In this context how can one process call/talk/interact with the other processes within the application. What are the options available here ? I could not find any sample which demonstrate multiple interacting processes within an app, any sample would be really helpful.

我将把它分成两部分:

如果您将应用程序 运行 视为 sidecar,这取决于 sidecar 的功能,但您有多种选择。基本上,您可以在 Linux 环境中做任何事情,请记住您是 运行 作为非 root 用户,您可以做。通过共享file/folder协调,拦截网络端口&代理到另一个端口,或其他ipc.

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

请注意,这种“外部”通信方法不一定需要 public,只需在容器外部即可。您可以使用像 broker/DB 这样的私人服务,或者您可以使用 internal routes & container networking.

Q4 : Difference between Multi Target Application vs Multi Process Application

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