

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 AWS Lambda 函數中管理 Gremlin WebSocket 連線
<a name="lambda-functions-websocket-connections"></a>

如果您使用 Gremlin 語言變體來查詢 Neptune，驅動程式會使用 WebSocket 連線來連線到資料庫。WebSockets旨在支援長期用戶端與伺服器連線案例。 AWS Lambda另一方面， 旨在支援相對短期和無狀態的執行。使用 Lambda 查詢 Neptune 時，這種在設計理念上的不相符可能會導致一些非預期的問題。

 AWS Lambda 函數會在[執行內容](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html)中執行，該內容會將函數與其他函數隔離。執行內容是在第一次調用函數時建立的，並且可在後續調用相同函數時重複使用。

不過，任何一個執行上下文永不會用來處理函數的多個並行調用。如果多個用戶端同時調用您的函數，Lambda 會為每個函數執行個體[啟動額外的執行內容](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)。所有這些新的執行內容可能轉而在後續的函數調用中重複使用。

在某些時間點，Lambda 會回收執行內容，特別是在它們已閒置一段時間的情況下。 透過 [Lambda 延伸](https://docs.aws.amazon.com/lambda/latest/dg/using-extensions.html) AWS Lambda 模組公開執行內容生命週期，包括 `Init`、 `Invoke`和 `Shutdown`階段。使用這些延伸模組，您可以撰寫程式碼，在回收執行內容時清除外部資源，例如資料庫連線。

常見的最佳實務是在 [Lambda 處理常式函數之外開啟資料庫連線](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)，以便可在每次呼叫處理常式時重複使用。如果資料庫連線在某個時候中斷，您可以從處理常式內部重新連線。不過，使用此方法存在連線洩漏的危險。如果閒置連線在執行內容銷毀後長時間保持開啟狀態，則間歇性或突發性 Lambda 調用案例可能會逐漸洩漏連線並耗盡資料庫資源。

Neptune 連線限制和連線逾時已隨著較新的引擎版本而變更。以前，每個執行個體最多支援 60,000 個 WebSocket 連線。現在，每個 Neptune 執行個體的並行 WebSocket 連線數目上限會[隨執行個體類型而有所不同](https://docs.aws.amazon.com/neptune/latest/userguide/limits.html)。

此外，從引擎 1.0.3.0 版開始，Neptune 會將連線的閒置逾時從一小時縮減至大約 20 分鐘。如果用戶端未關閉連線，連線會在 20 到 25 分鐘的閒置逾時後自動關閉。 AWS Lambda 不會記錄執行內容生命週期，但實驗顯示新的 Neptune 連線逾時與非作用中的 Lambda 執行內容逾時相符。回收非作用中執行內容時，其連線很有可能已被 Neptune 關閉，或者之後很快就會關閉。