IBM Cloud Docs
规划 Code Engine

规划 Code Engine

IBM Cloud® Code Engine 支持三种基本类型的工作负载: 应用程序,作业和函数。

应用程序(或称 app)运行您的代码,为 HTTP 请求提供服务。 除了传统的 HTTP 请求,IBM Cloud® Code Engine 还支持使用 WebSockets 作为通信协议的应用程序。 将根据入局请求和配置设置自动向上或向下扩展应用程序的运行实例数 (为零)。 应用程序包含一个或多个修订版。 修订版表示应用程序的配置属性的不可改变版本。 每次更新应用程序配置属性都会创建应用程序的新修订版。

作业并行运行可执行代码的一个或多个实例。 与处理 HTTP 请求的应用程序不同,作业只运行一次就会退出。 创建作业时,可以指定每次运行作业时使用的工作负载配置信息。

函数是一种无状态代码段,在 HTTP 请求调用时执行任务。 利用 IBM Code Engine功能,您可以以可扩展和无服务器的方式运行您的业务逻辑。 IBM Code Engine功能提供优化的运行环境,支持低延迟和快速扩展。 您的函数代码可以在包含特定 Node.js 或 Python 版本的托管运行时中编写。

比较 Code Engine 应用程序、工作和函数
特性 应用程序 作业 功能
执行时间 (持续时间) 长时间运行 (每个请求 10 分钟) 长时间运行 (最多 24 小时) 短时间运行 (2 分钟或更少)
启动等待时间 调度的开始时间
终止 持续运行 运行至完成 运行至完成
调用 根据请求或永久运行 已安排 根据请求,即时
编程模型 基于容器的构建和执行 基于容器的构建和执行 特定于语言的源代码文件和依赖关系元数据
并行性 并行执行,灵活 从低到中并行执行 高并行执行
横向扩展 基于请求数 基于作业工作负载定义 基于事件或直接调用
优化对象 长期运行,高度复杂的工作负载和随需应变的向外扩展 具有高资源需求的已调度或计划工作负载 启动时间和快速向外扩展

Code Engine 用例

虽然 Code Engine 的用例各不相同,但以下是一些入门示例。

使用容器经验丰富,但没有管理集群的技能或预算
您是了解容器的开发者。 但是,您不希望管理集群的复杂性或时间消耗。 通过 Code Engine,您无需担心管理集群所需的技能或管理集群所需的时间。 相反,Code Engine 会使这些复杂性消失,IBM 团队会将基础架构作为 IBM Cloud 服务的一部分进行管理。
具有间歇性峰值的工作负载
您的 Web 站点在周末繁忙,但在一周内的流量较少。 由于此 Web 站点经历了连续的活动和不活动时间段,因此 Code Engine 是一个很好的解决方案。 通过 Code Engine,Web 站点应用程序会自动扩展应用程序实例以增加流量,然后在不活动期间 (甚至降为零) 再次后退。
与存储集成的批处理工作负载
您的批处理作业将在每个月月底处理员工工资。 因为此作业每月运行一次,所以它大部分时间处于空闲状态,但在运行时消耗大量 CPU 和内存。 批处理作业需要与存储器集成以存储结果。 通过使用 Code Engine,您可以将批处理作业与 IBM Cloud Object Storage 集成,并且仅对作业运行时使用的资源收费。 当作业处于空闲状态时,它不会消耗任何资源,因此不会产生费用。 但是,作业可能会因 IBM Cloud Object Storage 实例而产生成本。
带来您的工作负载
您的部分工作是创建映像并进行部署。 您在创建容器映像和部署容器映像方面经验丰富,但您希望简化此过程,以便可以集中精力执行其他任务。 通过 Code Engine,您可以构建映像并直接从同一接口进行部署,从而简化日常任务并腾出时间来开发更多代码。
测试,概念验证或“分层”
您有兴趣了解有关基于容器的体系结构的更多信息。 您的团队开发了一个应用程序,但希望在向项目干系人显示该应用程序之前对其进行测试。 此应用程序很小,因此他们不想为哪怕是一个小型的专用集群付费。 在这种情况下,您可以测试应用程序,然后向项目干系人提供设计的概念验证,而无需专用集群可能需要的成本。

何时使用应用程序,作业或功能

应用程序和作业非常相似,最终,它们都只是运行代码。 但是,当您决定将代码构造为应用程序或作业时,需要考虑一些关键方面。

您的代码是否需要响应事件?

在 Code Engine 中,任何传入的 HTTP 请求(即使是加载网页的请求)或 REST API 调用都被视为一个事件。 在选择应用程序还是作业时,事件驱动的概念往往是关键因素,因为顾名思义,应用程序是根据 HTTP 请求运行的,而作业是根据调用结果运行的。

如果您知道您的工作负载会响应传入的 HTTP 请求,那么应用程序就是正确的选择。 但是,如果您的工作负载已运行并完成,那么作业更适合。

您的代码如何扩展?

应用程序和作业都是可扩展的。 应用程序根据可测量的实时条件 (例如,活动入局请求数) 进行缩放,因为应用程序的每个实例一次可能只能处理特定数目的并发请求。 根据创建作业时指定的实例数来缩放作业。

如果你知道你需要运行特定数量的代码实例,并且每个实例都可以在没有 HTTP 请求的情况下运行,那么作业就是正确的选择。 但是,如果实例数量必须根据传入的 HTTP 负载动态扩展,应用程序则更适合。

Code Engine 的常见方案

阅读其中一些常见场景,了解何时选择特定类型的工作负载。

您的工作负载需要低延迟还是交互式工作负载?
如果工作负载要求客户机或用户同步等待请求的响应,并且响应必须在几毫秒内可用,请使用应用程序。 应用程序提供可外部访问的端点并同步响应请求。 此类工作负载的示例包括 Web 站点,聊天机器人和移动应用程序。 使用 应用程序
您的计算是否是轻量级的,是否需要低 CPU,低内存和低 I/O?
如果工作负载是轻量级的,并且需要较低的 CPU,内存和 I/O,那么可用于应用程序的并行选项可能很有用。 典型的示例是提供基本操作并通过 NoSQL 数据库提供支持的 API 服务器。 这些类型的请求通常具有少量数据,并且需要较低的内存或更少的 CPU 周期。 通过更高的并行性,应用程序可以在第二个请求等待 I/O 时处理第一个请求的数据。 由于 CPU 和内存需求较低,因此可以同时运行许多请求。 使用 应用程序
您的计算是否与 CPU,内存或 I/O 绑定?
要处理特定数量的数据,其中每个数据块都很大,需要大量的 CPU 和内存,作业通常是更好的选择。 但是,如果工作负载需要请求/响应模式,那么也可以使用应用程序。 在这两种情况下,计算任务都以单一并行方式运行。 每个应用程序实例或作业任务仅同时处理一个请求或数据块,以充分利用为该实例配置的资源。 并行性是通过实例或任务的数量实现的,其中由于资源约束过高,创建额外任务的成本可以忽略不计。 典型示例是处理 Object Storage 存储区中的图像数据或提供机器学习模型。 使用 应用程序作业
您的计算是否运行了很长时间?
如果计算运行时间较长,那么由于其异步性质,作业是更好的选择。 应用程序的最大持续时间始终受到限制,因为大规模维护开放式连接的成本很高。 典型工作负载是训练机器学习模型或超参数优化。 使用 作业
是否可以预先指定计算的并行性?
如果您知道需要执行多少计算,那么可以运行具有精确实例数的作业,直到该作业完成为止。 典型示例包括超参数调整或训练神经网络。 使用 作业
您的工作负载是否会对某个事件作出反应?
如果需要工作负载来对事件 (例如推送到存储库的 Git 落实),上载到 Object Storage 存储区的对象或在数据库中修改的文档) 作出反应,请使用应用程序。 应用程序提供可配置为从事件源接收事件的端点。 使用 应用程序
是否需要在短时间内处理大量数据以响应事件或请求?
如果您的工作负载需要对未预测的请求或事件进行快速响应,那么应用程序通常更适合,因为应用程序是动态缩放的,甚至从零开始。 使用 应用程序
组合应用程序和作业
您甚至可以将应用程序和作业组合在一起,在这些应用程序中,应用程序可以启动作业以外包特定计算。 作业还可以查询应用程序。 作业和应用程序组合的一个典型示例是机器学习模型的训练和服务。 作业通常用于训练模型,而应用程序用于为模型提供服务。 使用 应用程序作业