2 回答

TA貢獻1725條經驗 獲得超8個贊
問題是在第一個請求(真正的請求,而不是預熱請求,因為預熱請求不會通過您的應用程序代碼,它不會觸發加載實際請求路徑中使用的類)JVM 加載(讀取、解析、驗證等...)相關類,初始化安全組件(密碼等...)并完成 TLS 握手(需要多個 RTT,使用 Java 9 和 TLS 1.3,這應該減少)。
首次 AWS 服務調用(DynamoDB、SQS 等)也出現了類似的長時間行為
由于我是 Thundra 預熱插件的作者,我正在考慮為預熱消息引入掛鉤點,因為自定義操作將能夠執行,如初始化安全組件、加載類等......

TA貢獻1864條經驗 獲得超6個贊
VPC 內的 Lambda 函數對啟動時間有很大影響。您說您的 ES 是托管實例,所以我假設它由 VPC 支持。
即使不在 VPC 中,Java 冷啟動通常也比 Node 或 Python 等運行時長,因為需要先啟動 JVM。這主要是您的 2.5 秒的來源。
好的。如何解決問題?
這取決于 ElasticSearch 需要多少并發連接。如果一個函數能夠處理所有傳入請求,那么您可以將 Lambda 函數的并發執行限制為 1,因此您可以確保始終訪問同一個容器(只要這些請求是在 ±5 分鐘內發出的)大體時間)。
現在,如果您事先不知道將執行多少并發 Lambda 函數,那么您就沒有出路了。您可以嘗試預先預熱您的 Lambda 函數,但是您需要同時觸發 100 個請求來預熱 100 個不同的容器。
當我瀏覽 Lambda 函數的并發模型以及冷/熱啟動如何工作時,請檢查此答案。
如果您有更多信息要分享或者我不夠清楚,我很樂意編輯我的答案。
添加回答
舉報