在 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
。 - 基本數據類型。Future方法只能接受基本數據類型(例如,
String
,Integer
,Id
)。它們不能將複雜對象作為參數。 - 調用。如果future方法需要執行Web服務調用,則必須在注釋中包含
callout=true
屬性,以允許該方法執行調用。
public class FutureClass {
@future(callout = true)
public static void myFutureMethod(){
//在這裡進行調用
}
}
Queueable 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 作業,允許您從已執行的作業中啟動第二個作業,創建一系列異步操作。
Batch Apex
當您需要對大量記錄運行異步操作時,Batch Apex 是理想的解決方案。它將您的大數據集劃分為更小、可管理的塊進行處理。
要實現Batch Apex,您的類必須實現Database.Batchable
接口。Batch Apex類應該定義三個方法:start
、execute
和finish
。
1. 開始方法
此方法在批處理作業開始時執行。它應該包含用於收集大數據集的SOQL查詢並返回QueryLocator
。在使用Batch 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
方法接受兩個參數:
- Batch Apex類的一個實例。
- 一個可選的批次大小參數,指定每批的記錄數。您可以指定的最大批次大小是2000。
ID batchprocessid = Database.executeBatch(new BatchApex(),2000);
在使用異步Apex時的最佳實踐
避免在高流量流程中觸發未來或可排隊的方法
在可能耗盡每日非同步限制的流程中觸發未來或可排隊的方法時要謹慎,例如 Apex 觸發器。這些流程可能會迅速消耗可用的非同步資源。
優化性能
確保未來或可排隊的方法性能已優化。這包括:
- 優化查詢以減少處理時間。
- 最小化網絡服務調用持續時間。
- 精簡任何相關邏輯,例如觸發器或流程,以防止瓶頸。
對於大數據量使用批量 Apex
在處理大量記錄時,始終優先選擇批量 Apex,而不是未來或可排隊的方法。批量 Apex 設計用於有效處理大量數據集,而未來和可排隊的方法則更適合處理較小的任務。
可排隊 Apex 提供更大的靈活性
與未來方法相比,可排隊 Apex 提供了對作業執行的更多控制,例如將作業鏈接在一起或更有效地處理更大的數據量。
結論
總的來說,在Salesforce中,非同步Apex是一個強大的工具,用於處理長時間運行、資源密集型的過程,同時保持系統性能和用戶體驗。通過了解不同的非同步方法,如Future Methods、Queueable Apex和Batch Apex,並遵循最佳實踐,您可以設計高效、可擴展的解決方案,優化代碼和系統資源。請記住考慮因素,如管理員限制、性能優化和錯誤處理,以確保您的非同步作業運行順暢且可靠。
Source:
https://dzone.com/articles/asynchronous-processing-salesforce-overview