批量化记录处理以避免 CPU 限制示例
了解如何重构流,以使用防止 Apex_CPU_TIME_LIMIT_EXCEEDED 错误的批量化模式。此示例显示了低效和优化流设计之间的差异。
所需的 Edition
| 查看支持的版本。 |
| 所需用户权限 | |
|---|---|
| 要使用 Flow Builder 中提供的所有流类型、元素和功能(包括 Einstein 和 Agentforce for Flow)打开、编辑、创建、激活或取消激活流: | 管理流 |
此示例显示了如何将在循环中执行数据操作语言 (DML) 的流转换为高效处理记录的批量化流。查看前后比较,并了解流批量化的原理。
场景
构建记录触发的流,并在业务机会关闭时运行。对于每个已结束并赢得的业务机会,流会为业务机会团队的每个成员创建跟进任务。流程:
- 获取所有业务机会团队成员。
- 创建分配给每个团队成员的任务。
- 即使用户一次更新多个业务机会,也能高效工作。
- 避免批量操作期间的 Apex_CPU_TIME_LIMIT_EXCEEDED 错误。
Salesforce 对每个同步事务强制实施 10,000 毫秒(10 秒)的单个 CPU 时间限制。该事务中的每个自动化项目 — Apex 触发器、流、工作流规则和流程 — 都来自相同的预算。低效的流设计使问题更加复杂。事务中的其他自动化会先减少共享预算,而低效的流会消耗掉剩余部分不必要的资源。
流的运行顺序取决于流类型。本示例使用保存后记录触发的流,该流的运行顺序晚于保存前流。有关运行顺序的详细信息,请参阅触发器和执行顺序。
低效方法:循环中的 DML 操作
此方法在处理多个业务机会时会导致 CPU 限制错误。
流结构:该流从业务机会对象上的记录触发的流开始,该流在阶段等于“已结束并赢得客户”时在记录更新后运行。该流使用获取记录来获取触发记录的业务机会团队成员,然后循环遍历集合。在循环中,创建记录元素会为每个团队成员创建一个任务。
此方法失败的原因:
- 每个循环迭代执行单独的 DML 操作。
- 包含 5 名团队成员的业务机会会导致 5 次 DML 操作。
- 当用户一次更新 20 个业务机会时,流会在一个事务中处理所有业务机会。
- 20 个业务机会 × 5 个团队成员 = 一个事务中的 100 个 DML 操作。
- 100 个 DML 操作的累积 CPU 时间超过了调控器限制。
- 结果:Apex_CPU_TIME_LIMIT_EXCEEDEDED 错误。
高效方法:基于集合的批量化
这种方法可以高效地处理记录,而不管数量如何。
流结构:该流从业务机会对象上的记录触发的流开始,并使用获取记录来获取业务机会团队成员。该流创建任务记录变量和任务记录集合变量。记录变量保存流正在处理的当前任务,记录集合保存要创建的任务。流在团队成员之间循环。在循环中,分配元素通过设置任务记录变量的值来构建每个任务记录,并将任务与循环中的当前团队成员相关联。其他分配元素会将任务记录变量值添加到任务记录集合。循环完成后,单个创建记录元素会从集合中创建所有任务。
为什么这样做:
- 该循环在不执行 DML 操作的情况下构建任务记录集合。
- 循环完成后,仅发生一次 DML 操作。
- 包含 5 个团队成员的业务机会仍然只导致 1 个 DML 操作(一次创建 5 个任务)。
- 当用户一次更新 20 个业务机会时,流总共执行 20 个 DML 操作(每个业务机会一个)。
- 显著减少 CPU 时间消耗。
- 结果:流成功完成,没有达到调控器限制。
性能比较
| 场景 | 低效(循环中的 DML) | 高效(批量化) |
|---|---|---|
| 1 个包含 5 名团队成员的业务机会 | 5 个 DML 操作 | 1 个 DML 操作 |
| 20 个业务机会(批量更新),每个业务机会 5 名团队成员 | 100 个 DML 操作 (可能因 CPU 限制错误而失败) |
20 个 DML 操作 (成功完成) |
| 100 个业务机会(数据加载),每个业务机会 3 名团队成员 | 300 个 DML 操作 (肯定会失败) |
100 个 DML 操作 (成功完成) |
批量化的关键原则
- 切勿在循环中执行 DML 操作。始终在循环期间收集集合变量中的记录,然后在循环完成后执行 DML。
- 从一开始就为批量操作设计。假设记录触发的流同时处理多个记录。
- 使用记录集合变量。基于集合的 DML 操作比单个操作的效率要高得多。
- 使用实际容量进行测试。带有一个记录的调试模式不会显示批量操作问题。使用数据导入向导、Data Loader 或批量更新进行测试。
- 监控性能。查看调试日志,以在生产中失败前识别接近调控器限制的流。
高级步骤
查看本示例的步骤。按照它们的顺序操作,或转到部分,以获取更具体的说明。
- 创建流
设置记录触发的流,以在业务机会关闭时运行。 - 创建资源
创建批量化处理所需的变量。 - 获取团队成员
使用获取记录元素获取业务机会团队成员记录进行处理。 - 添加决策以检查团队成员
添加决策元素,以避免在没有团队成员时进行处理。 - 添加循环元素
添加循环元素以迭代团队成员。 - 在循环中构建任务记录
为循环中的每个团队成员填充 TaskRecord 记录变量的字段值。 - 将任务添加到集合
将每个任务记录添加到 TasksToCreate 集合变量,以便批量创建。 - 循环后创建所有任务
使用单个创建记录元素,以在一个操作中创建所有任务。 - 添加错误处理
配置故障管理,以捕获和报告错误。 - 使用批量数据测试
测试批量化流需要模拟批量操作。 - 更多优化技术
使用这些技术进一步优化批量化流。 - 转换现有流
将循环中具有数据操作语言 (DML) 操作的流转换为批量化模式。
创建流
设置记录触发的流,以在业务机会关闭时运行。
-
打开流列表视图。
- 从“设置”中,在快速查找框中,输入流,然后单击流。
- 从自动化应用程序中,选择流选项卡。
- 从任何 Lightning 应用程序的“流”选项卡中,单击操作菜单并选择打开流。
-
创建记录触发的流。
- 从 Automation Lightning 应用程序中,单击新建。搜索并选择记录触发流。
- 从“设置”中,单击新建流,搜索并选择记录触发的流。
配置开始面板将打开。 -
配置“开始”元素。
- 对于对象,选择业务机会。
- 对于何时触发流,选择更新记录。
- 在“设置条目条件”部分,对于条件要求,选择满足所有条件 (AND)。
- 对于字段,选择阶段。
- 对于运算符,选择等于。
- 对于值,选择已结束并赢得。
- 对于优化流,选择操作和相关记录。
创建资源
创建批量化处理所需的变量。
-
要构建每个任务,请创建用于构建任务记录的记录变量。
-
要打开工具箱,请单击
。
- 单击新建资源,然后选择变量。
- 对于 API 名称,输入 TaskRecord。
- 对于数据类型,选择记录。
- 对于对象,选择任务。
- 单击“完成”。
-
要打开工具箱,请单击
-
要存储所有任务,请为所有任务创建记录集合变量。
- 单击新建资源,然后选择变量。
- 对于 API 名称,输入 TasksToCreate。
- 对于数据类型,选择记录。
- 对于对象,选择任务。
- 选择以允许多个值(集合)。
- 单击“完成”。
获取团队成员
使用获取记录元素获取业务机会团队成员记录进行处理。
-
单击
,然后搜索并选择获取记录。
-
配置元素。
- 对于标签,输入获取业务机会团队成员。
-
对于对象,选择业务机会联系人角色。
在此示例中,流会将团队成员存储在业务机会联系人角色对象中。将业务机会链接到联系人的对象。
- 在“筛选业务机会联系人角色记录”部分,对于字段,选择业务机会 ID。
- 对于运算符,选择等于。
- 对于值,选择触发业务机会,然后选择业务机会 ID。
- 对于存储的记录数量,选择所有记录。
- 对于如何存储记录数据,选择自动存储所有字段。
添加决策以检查团队成员
添加决策元素,以避免在没有团队成员时进行处理。
-
单击
,然后搜索并选择决策。
-
配置决策。
- 对于标签,输入找到团队成员?。
- API 名称自动填写。
- 对于结果标签,输入是。
- API 名称自动填写。
- 对于资源,从获取业务机会团队成员中选择业务机会联系人角色。
- 对于运算符,选择为空。
- 对于值,选择假。
- 单击默认结果。
- 对于标签,输入否。
添加循环元素
添加循环元素以迭代团队成员。
-
在“是”路径中,单击
,然后搜索并选择循环。
-
配置循环。
- 对于标签,输入迭代团队成员。
- API 名称自动填写。
-
对于集合变量,从获取业务机会团队成员中选择业务机会联系人角色。
此资源显示为单数,即使它包含多个记录。
- 对于方向,选择第一项到最后一项。
在循环中构建任务记录
为循环中的每个团队成员填充 TaskRecord 记录变量的字段值。
-
在“每个”后,单击
,然后搜索并选择分配。
-
配置分配。
- 对于标签,输入构建任务记录。
- API 名称自动填写。
- 对于变量,选择 TaskRecord,然后选择主题。
- 对于运算符,选择等于。
- 对于值,输入跟进已结束业务机会
- 单击 + 添加分配。
-
继续添加分配和设置值。
资源 运算符 值 TaskRecord>状态 等于 未开始 TaskRecord>优先级 等于 高 TaskRecord>分配给 ID 等于 来自循环的当前项目>联系人 ID TaskRecord>相关 ID 等于 触发业务机会>业务机会 ID
将任务添加到集合
将每个任务记录添加到 TasksToCreate 集合变量,以便批量创建。
-
在分配元素后,并仍在循环中,单击
,然后搜索并选择分配。
-
配置分配。
- 对于标签,输入将任务添加到集合。
- 对于变量,选择 TasksToCreate。
- 对于运算符,选择加。
- 对于值,选择 TaskRecord,然后选择整个资源。
循环后创建所有任务
使用单个创建记录元素,以在一个操作中创建所有任务。
-
循环结束后,单击
,然后搜索并选择创建记录。
-
配置元素。
- 对于标签,输入创建所有任务。
- 对于如何设置记录字段值,选择从记录变量。
- 对于要创建的记录数量,选择多个。
- 对于记录集合,选择 TasksToCreate。
- 保存流。
- 对于标签,输入创建业务机会团队成员的任务。
- API 名称自动填写。
添加错误处理
配置故障管理,以捕获和报告错误。
-
要管理错误,请将错误路径添加到创建记录元素。
- 单击“创建所有任务”元素上的三个点,并选择添加错误路径。
-
要通知 Salesforce 管理员错误路径中的失败,请添加发送电子邮件操作。
-
在错误路径中,单击
,然后搜索并选择发送电子邮件。
- 对于标签,输入通知管理员错误。
- API 名称自动填写。
- 对于收件人地址,输入您想要接收通知的人员的电子邮件地址。
- 对于主题,输入需要注意的流
- 对于正文,输入“为业务机会团队成员创建任务”流出错。以下是错误:.
- 单击插入资源。
- 选择运行流,然后选择错误消息。
-
在错误路径中,单击
- 保存操作。
使用批量数据测试
测试批量化流需要模拟批量操作。
- 要测试单个记录,请使用调试模式更新一个业务机会,并验证流是否正确创建任务。
- 启用流。
-
要在 Sandbox 中测试批量操作,请使用数据导入向导、Data Loader 或列表视图一次更新多个业务机会。
- 创建 10 到 20 个测试业务机会。
- 将团队成员添加到每个业务机会。
- 使用 Data Loader 或批量更新,以同时将所有业务机会的阶段更改为“已结束并赢得客户”。
- 验证流是否创建所有任务没有错误。
- 要验证性能,请查看 Apex 调试日志,以确认 CPU 时间消耗在可接受的限制内。
更多优化技术
使用这些技术进一步优化批量化流。
使用条目条件限制执行
将条件添加到流开始元素,以确保它仅在必要时运行。例如,仅处理超过一定数量或来自特定记录类型的业务机会。
考虑非关键操作的保存后处理
保存后记录触发的流可以在您保存业务机会后创建后续任务。它们异步运行,并具有更高的调控器限制。
非常大的批量的批处理流程
如果业务机会定期有数十名团队成员,请使用计划流程批量处理已结束的业务机会,而不是实时处理。
转换现有流
将循环中具有数据操作语言 (DML) 操作的流转换为批量化模式。
如果您有循环中的 DML 操作的现有流,请按照以下步骤进行转换。
- 要在循环中查找 DML 操作,请识别循环中的所有创建记录、更新记录和删除记录元素。
-
对于每个 DML 元素,执行转换。
- 要构建记录,请为该对象类型创建记录变量。
- 要存储您想要处理的记录,请为该对象类型创建记录集合变量。
- 要保存记录的字段值,请使用分配元素将值分配到记录变量。
- 要收集要处理的记录,请使用分配将记录变量添加到记录集合。
- 为了高效地创建记录,在循环后,添加一个处理整个记录集合的 DML 元素。
- 要验证转换,请使用批量数据彻底测试,以验证重构是否正常工作。

