本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Lambda 函數快照前後實作程式碼
您可以在 Lambda 建立快照之前或 Lambda 從快照恢復函數之後,使用執行階段掛鉤來實作程式碼。執行階段掛鉤可做為開放原始碼 Coordinated Restore at Checkpoint (CRaC) 專案的一部分使用。目前正在針對 Java 開發套件 (OpenJDK)
-
Resource
- 具有兩種方法 (beforeCheckpoint()
和afterRestore()
) 的介面。使用這些方法來實作您想在快照建立之前和還原之後執行的程式碼。 -
Context <R extends Resource>
- 若要接收檢查點和還原的通知,必須透過Context
註冊Resource
。 -
Core
- 協調服務,透過靜態方法Core.getGlobalContext()
提供預設的全域Context
。
如需 Context
和 Resource
的詳細資訊,請參閱 CRaC 文件中的套件 org.crac
使用下列步驟,透過 org.crac 套件
步驟 1:更新建置組態
將 org.crac
相依性新增到建置組態。以下範例使用 Gradle。如需其他建置系統的範例,請參閱 Apache Maven 文件
dependencies { compile group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1' # All other project dependecies go here: # ... # Then, add the org.crac dependency: implementation group: 'org.crac', name: 'crac', version: '1.4.0' }
步驟 2:更新 Lambda 處理常式
Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。函數會執行,直到處理常式傳回回應、結束或逾時為止。
如需詳細資訊,請參閱 在 Java 中 Lambda 義函數處理程序。
以下處理常式範例示範如何在檢查點之前 (beforeCheckpoint()
) 和還原之後 (afterRestore()
) 執行程式碼。此處理常式也會向執行階段管理的全域 Context
註冊 Resource
。
注意
Lambda 建立快照時,初始化程式碼最多可能會執行 15 分鐘。時間上限為 130 秒或設定的函數逾時 (最長 900 秒),以較高者為準。您的 beforeCheckpoint()
執行時間掛鉤會計入初始化程式碼時間限制。Lambda 還原快照時,執行階段 (JVM) 必須載入,且 afterRestore()
執行階段掛鉤必須在逾時限制 (10 秒) 內完成。否則,你會得到一個 SnapStartTimeoutException.
... import org.crac.Resource; import org.crac.Core; ... public class CRaCDemo implements RequestStreamHandler, Resource { public CRaCDemo() { Core.getGlobalContext().register(this); } public String handleRequest(String name, Context context) throws IOException { System.out.println("Handler execution"); return "Hello " + name; } @Override public void
beforeCheckpoint
(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("Before checkpoint"); } @Override public voidafterRestore
(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("After restore");
Context
僅會對已註冊物件維持 WeakReference
Resource
Resource
的強式參考,才能保證執行階段掛鉤會執行。
以下是須避免的兩個模式範例:
範例 - 沒有強式參考的物件
Core.getGlobalContext().register( new MyResource() );
範例 - 匿名類別的物件
Core.getGlobalContext().register( new Resource() { @Override public void afterRestore(Context<? extends Resource> context) throws Exception { // ... } @Override public void beforeCheckpoint(Context<? extends Resource> context) throws Exception { // ... } } );
而是維持強式參考。在下列範例中,已註冊的資源不是回收的垃圾,且執行階段掛鉤會一致地執行。
範例 - 有強式參考的物件
Resource myResource = new MyResource();
// This reference must be maintained to prevent the registered resource from being garbage collected
Core.getGlobalContext().register( myResource );