学习目标
完成本单元后,您将能够:
- 解释同步和异步处理之间的区别。
- 选择在各种情况下使用哪种异步Apex。
异步Apex
简而言之,异步Apex用于在稍后的时间在单独的线程中运行进程。
异步进程是一个进程或函数,在用户不必等待任务完成的情况下,在后台执行任务。
这是一个真实世界的例子。比方说,在每周的跳舞革命练习之前,你有一份要完成的事情。你的车发出一个有趣的噪音,你需要一个不同颜色的发胶,你必须从你妈妈的房子拿起你的制服。你可以把你的汽车交给机修工,在完成清单的其余部分(同步处理)之前先等你的汽车修理好,或者你可以把它留在那里,完成其他事情,并且在修理之前让商店给你打电话(异步处理)。如果你想在练习之前及时回家锻炼你的斯潘德克斯,异步处理可以让你在相同的时间内完成更多的工作,而不需要等待。
您通常会使用Asynchronous Apex调出外部系统,需要更高限制的操作以及需要在特定时间运行的代码。异步处理的主要好处包括:
- 用户效率
-
假设有一个进程在创建一个机会时对一个自定义对象进行许多计算。执行这些计算所需的时间范围可以从轻微的烦恼到用户的生产力封锁。由于这些计算不会影响用户目前正在做的事情,所以让他们等待长时间运行的过程并不是有效利用他们的时间。通过异步处理,用户可以继续工作,处理可以在后台完成,用户可以方便地看到结果。
- 可扩展性
-
通过在将来某个时间点资源可用时允许平台的某些功能执行,可以快速管理和缩放资源。这允许平台使用并行处理来处理更多作业。
- 更高的限制
- 异步进程在新线程中启动,具有更高的调控和执行限制。说实话,不是每个人都想要更高的州长和执行限制吗?
异步Apex有许多不同的风格。我们稍后会详细介绍每一个细节,但这里有一个高层次的概述。
类型 | 概观 | 常见的情况 |
---|---|---|
未来的方法 | 在自己的线程中运行,并且在资源可用之前不要启动。 | Web服务标注。 |
批次Apex | 运行超过正常处理限制的大型作业。 | 数据清理或存档记录。 |
可排队的 Apex | 与未来的方法类似,但提供额外的作业链,并允许使用更复杂的数据类型。 | 使用外部Web服务执行顺序处理操作。 |
计划的 Apex | 安排Apex在指定的时间运行。 | 每日或每周的任务。 |
还值得注意的是,这些不同类型的异步操作不是相互排斥的。例如,一个常见的模式是启动预定Apex作业中的批量Apex作业。
增加总督和执行限制
运行异步Apex的主要好处之一是更高的调控和执行限制。例如,使用异步调用时,SOQL查询的数量从100到200个查询翻倍。异步调用的总堆大小和最大CPU时间也相似。
不仅可以通过异步获得更高的限制,而且这些控制器限制独立于最初排队异步请求的同步请求的限制。这是一口,但实质上,你有两个单独的Apex调用,并且是超过两倍的处理能力。例如,当您想在当前事务中尽可能多地执行处理时,当您开始接近管理员限制时,可以非常方便地继续操作。
如果您喜欢阅读关于堆大小,最大执行时间和总体限制的信息,请参阅执行调控器和限制以获取令人信服的详细信息。
异步处理如何工作
异步处理在多租户环境中存在一些挑战:
- 确保处理的公正性
-
确保每个客户获得公平的处理资源份额。
- 确保容错
- 确保没有异步请求由于设备或软件故障而丢失。
该平台使用基于队列的异步处理框架。此框架用于管理每个实例中的多个组织的异步请求。请求生命周期由三部分组成:
- 入队
-
请求被放入队列中。这可能是Apex批量请求,未来的Apex请求或其他许多请求中的一个。该平台将排队请求以及相应的数据来处理该请求。
- 坚持
-
排队的请求被持久化。请求被存储在永久性存储器中以用于故障恢复并提供事务处理能力。
- 出列
- 已排队的请求将从队列中移除并进行处理。事务管理在这一步发生,以确保消息不会丢失,如果有处理失败。
每个请求都由一个处理程序处理。处理程序是执行特定请求类型的函数的代码。处理程序由构成实例的每个应用程序服务器上的有限数量的工作线程执行。线程从排队框架中请求工作,并在收到时启动特定的处理程序来完成工作。
资源保护
异步处理的优先级低于通过浏览器和API进行的实时交互。为了确保有足够的资源来处理增加的计算资源,排队框架监视系统资源(如服务器内存和CPU使用率),并在超过阈值时减少异步处理。这是说多租户系统保护自己的一种奇特的方式。如果一个组织尝试“吞噬”超过其资源份额,则异步处理将暂停,直到达到正常阈值。不管是处理时间还是没有保证,最终都会结束。