Spring Cloud Dataflow 上 Stream 部署的运行时实例数 (pods)

Number of runtime instances (pods) on Stream deployment on Spring Cloud Dataflow

我们现在正忙于一个我们想引入 SCDF 的新项目,但是 运行 遇到了一个主要问题,想知道你们是否遇到过类似的问题,你们是如何解决的。

我们看到,对于我们在 SCDF 中创建的每个流,部署(在 Kubernetes 上)为每个流创建单独的微服务实例。因此,如果微服务 A 在 3 个不同的流中使用,则在运行时我们有 3 个微服务 A 实例。在我们的解决方案中,我们有很多可重用的微服务,但如果 SCDF 为每个流实例化这些微服务,我们大约 运行 将近 400实例 (pods),如果我们在此基础上进行扩展,我们将使用大量资源。我们需要以某种方式找到一种跨流共享 pods(实例)的方法。 你遇到过这个问题吗?如果是,您对此的处理方式是什么?

有几种方法可以减少 pods 的数量。

  1. 使用函数组合。所有预打包的应用程序现在都是基于功能的,这意味着您可以将功能组合到单个源、接收器或处理器应用程序中。 SCDF 流定义至少需要一个源和接收器,但开箱即用的功能旨在在自定义应用程序中重复使用,这些应用程序可以根据需要应用这些功能来实现中间步骤。请记住,组合函数在内存中处理数据,消除了用于在单独 pods 之间传输数据的消息传递中间件。这可能会使您的应用更容易丢失数据。总有取舍。

  2. 使用命名目标:您可以使用命名目标共享流式传输管道的一部分。这允许您扇入或扇出。在此示例中,3 个流定义启用 2 个源来提供共享处理器和接收器。

    source1 > :my-named-destination
    source2 > :my-named-destination
    :my-named-destination > proccessor1 | sink1

  3. SCDF 的商业版支持使用实现多个 input/outputs 的自定义组件进行流定义。这为您提供了与上述类似的选项,其中自定义路由逻辑在内部实现

  4. 如果适合您的用例,您可以部署自定义任务来代替流。该任务可能会根据需要合并开箱即用的功能和功能组合。

组合组件时的一个重要考虑因素是增加流水线步骤之间的耦合和依赖性。简单的线性处理创造更多 pods 但更易于实施、部署、管理和推理。