在Salesforce中运行一个流程时,您首先应该问的问题是是否以同步或异步方式执行它。如果任务可以延迟且不需要立即结果,那么利用Salesforce的异步流程总是有益的,因为它们为您的技术架构提供了显著的优势。
什么是异步处理?
异步流程在自己的线程中运行,允许任务完成而不让用户等待。以下是主要好处:
1. 改善用户体验和性能
由于异步流程在后台运行,用户无需等待它们完成。这使得用户可以不中断地继续工作,同时改善页面加载时间和整体系统性能。
2. 更高的限制
Salesforce对同步事务施加严格限制,例如每个事务的查询数量或DML操作。异步处理提供额外的执行限制,为您提供更多扩展操作的空间。
3. 可扩展性
通过将复杂或资源密集型任务卸载到后台运行,异步处理帮助您的业务有效扩展,而不影响系统性能。
以下是Salesforce提供的各种用于异步处理的工具。
关键考虑因素
到目前为止,我们已经探讨了异步处理、其优势以及Salesforce提供的各种用于这些任务的工具。然而,在选择异步处理满足业务需求之前,有几个重要因素需要考虑。
1. 异步处理没有SLA
请记住,异步处理没有明确的服务级别协议(SLA)。它们在资源可用时在自己的线程中运行,这意味着不能保证任务将在特定时间范围内完成。因此,重要的是避免在对时间敏感的业务流程中使用异步处理。
2. 选择适合的工具
如前所述,Salesforce为异步处理提供了各种工具,每个工具都设计用于不同的用例。了解每个工具的优势和局限性将帮助您为特定需求选择最合适的工具。
3. 优化您的代码
虽然Salesforce为异步处理提供了更高的执行限制,但仍然至关重要的是对您的操作进行优化。这样可以确保您的代码能够高效处理多个记录,保持在平台的限制范围内并保持性能。
4. 实现错误处理和监控
由于异步作业在后台运行,强大的错误处理和监控至关重要。使用try-catch
块并将错误记录到自定义对象中以便更轻松地跟踪。此外,实现重试逻辑以处理间歇性故障,如API调用问题,以确保流程的可靠性。
深入了解异步工具
让我们更仔细地看看Salesforce中的每个异步工具。
Future方法
Future方法用于可以在自己的线程中独立运行的操作。一个常见用例是执行外部web服务调用,其中用户无需等待操作完成。
要定义一个Future方法,只需使用@future
注解标记该方法。
public class FutureClass {
@future
public static void myFutureMethod(list recordIds){
//长时间运行的操作代码
}
}
Future方法的关键点:
- 静态。Future方法必须是静态的。
- void返回类型。它们只能返回
void
。 - 基本数据类型。Future方法只能接受基本数据类型(例如,
String
,Integer
,Id
)。它们不能将复杂对象作为参数。 - 调用。如果Future方法需要进行web服务调用,必须在注解中包含
callout=true
属性,以允许该方法执行调用。
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//在此进行调用
}
}
可排队的Apex
类似于future方法,Queueable Apex允许您在其自己的线程中运行操作,非常适合长时间运行的任务。它利用了Apex作业队列,并提供了比future方法更灵活、更强大的异步处理方法。
要实现Queueable Apex,您的类必须实现Queueable
接口。该类应始终定义一个execute
方法,其中包含异步操作的逻辑。
public class QueueableClass implements Queueable{
public void execute(QueueableContext context){
//长时间运行的操作
}
}
您可以通过调用System.enqueueJob()
来执行Queueable Apex,该方法会将作业添加到队列并返回作业ID。可以使用此作业ID通过查询AsyncApexJob
对象来监视作业的状态。
ID jobID = System.enqueueJob(new QueueableClass());
关于Queueable Apex的关键点:
- 非原始数据类型。与future方法不同,您可以在Queueable类中使用非原始数据类型作为成员变量。
- 作业链接。Queueable作业可以链接,允许您从已经执行的作业开始第二个作业,从而创建一系列异步操作。
批处理Apex
当您需要对大量记录运行异步操作时,批处理Apex是理想的解决方案。它将您的大型数据集分成更小、可管理的块进行处理。
要实现批量 Apex,您的类必须实现 Database.Batchable
接口。批量 Apex 类应定义三个方法:start
、execute
和 finish
。
1. 开始方法
该方法在批处理作业开始时执行。它应包含用于收集大数据集的 SOQL 查询并返回 QueryLocator
。在使用批量 Apex 时,start
方法可以绕过 SOQL 查询检索的记录总数限制。
public Database.QueryLocator start(Database.BatchableContext bc) {}
2. 执行方法
每个记录批次都会调用 execute
方法。请注意,处理记录的顺序没有保证。
public void execute(Database.BatchableContext bc, list<Object>){}
3. 完成方法
在所有记录批次处理完毕后,会调用 finish
方法。它通常用于后处理任务,例如发送通知电子邮件。每次批处理作业的执行被视为一个单一事务,并且每个批次的限制会被重置。
要触发批处理作业,请使用 Database.executeBatch
方法。这会将批处理作业添加到异步队列中。
Database.executeBatch
方法接受两个参数:
- 一个批量 Apex 类的实例。
- 一个可选的批大小参数,指定每个批次的记录数。您可以指定的最大批大小为 2000。
ID batchprocessid = Database.executeBatch(new BatchApex(),2000);
使用异步 Apex 的最佳实践
避免在高负载流程中触发未来或可排队方法
当从可能耗尽每日异步限制(如Apex触发器)的流程触发未来或可排队方法时要小心。这些流程可能会快速消耗可用的异步资源。
优化性能
确保未来或可排队方法的性能得到优化。这包括:
- 优化查询以减少处理时间。
- 最小化Web服务调用持续时间。
- 简化任何相关逻辑,如触发器或流程,以防止瓶颈。
对大数据量使用批量Apex
处理大量记录时,始终优先选择批量Apex而不是未来或可排队方法。批量Apex被设计用于高效处理大数据集,而未来和可排队方法更适用于较小的任务。
可排队Apex提供更大的灵活性
与未来方法相比,可排队Apex在作业执行方面提供更多控制,例如能够将作业链接在一起或更有效地处理更大的数据量。
结论
总之,Salesforce 中的异步 Apex 是一个强大的工具,可用于处理长时间运行、资源密集型的流程,同时保持系统性能和用户体验。通过了解不同的异步方法 — 例如 Future Methods、Queueable Apex 和 Batch Apex — 并遵循最佳实践,您可以设计高效、可伸缩的解决方案,优化您的代码和系统资源。请记得考虑诸如管理限制、性能优化和错误处理等因素,以确保您的异步作业能够平稳可靠地运行。
Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview