簡體   English   中英

AWS lambda 和 Java 並發

[英]AWS lambda and Java concurrency

眾所周知,AWS lambda可能會重用早期創建的處理程序對象,它確實做到了(請參閱常見問題解答):

問:AWS Lambda 會重用函數實例嗎?

為了提高性能,AWS Lambda 可能會選擇保留您的函數實例並重用它來處理后續請求,而不是創建新副本。 您的代碼不應假設這將始終發生。


問題是關於Java並發性的。 如果我有一個處理程序的類,請說:

public class MyHandler {
    private Foo foo;
    public void handler(Map<String,String> request, Context context) {
       ...
    }
}

那么,在這里訪問和使用對象變量foo是否是線程安全的?

換句話說:AWS lambda 是否可以同時為不同的調用使用相同的對象?

編輯我的函數是在基於事件的源上處理的,特別是它是由 API 網關方法調用的。

EDIT-2當您想實現某種與外部資源的連接池時,會出現此類問題,因此我想將與外部資源的連接保持為對象變量。 它實際上按預期工作,但我擔心並發問題。

EDIT-3更具體地說,我想知道: AWS lambda 的處理程序實例是否可以共享公共堆(內存) 我必須指定這個額外的細節,以防止列出關於 java 線程安全對象的明顯和常見的事情的答案。

AWS lambda 可以為不同的調用同時使用相同的對象嗎?

AWS lambda 的處理程序實例是否可以共享公共堆(內存)?

一個強有力的,明確的否。 AWS Lambda 的處理程序實例甚至無法共享文件(在/tmp )。

一個 AWS Lambda 容器不能被重復用於兩個或多個同時存在的 Lambda 函數調用,因為這會破壞隔離要求:

問:AWS Lambda 如何隔離我的代碼?

每個 AWS Lambda 函數都在其自己的隔離環境中運行,具有自己的資源和文件系統視圖。

lambda 函數如何工作的官方描述中的“AWS Lambda 如何運行我的代碼?容器模型”部分指出:

執行 Lambda 函數后,AWS Lambda 會維護容器一段時間,以期待另一個 Lambda 函數調用。 實際上,如果 AWS Lambda 在再次調用 Lambda 函數時選擇重用容器,則該服務會在 Lambda 函數完成后凍結容器,並解凍容器以供重用。 這種容器重用方法具有以下含義:

  • Lambda 函數代碼中的任何聲明都保持初始化狀態,從而在再次調用該函數時提供額外的優化。 例如,如果您的 Lambda 函數建立了數據庫連接,而不是重新建立連接,而是在后續調用中使用原始連接。 您可以在代碼中添加邏輯以在創建連接之前檢查連接是否已存在。

  • 每個容器在 /tmp 目錄中提供一些磁盤空間。 當容器被凍結時,目錄內容仍然存在,提供可用於多次調用的臨時緩存。 您可以添加額外的代碼來檢查緩存是否包含您存儲的數據。

  • 如果 AWS Lambda 選擇重用容器,則由您的 Lambda 函數啟動但在函數結束時未完成的后台進程或回調將恢復。 在代碼退出之前,您應該確保代碼中的任何后台進程或回調(在 Node.js 的情況下)都已完成。

如您所見,在嘗試利用容器重用時,絕對沒有關於 Lambda 函數的多個並發調用之間的競爭條件的警告。 唯一需要注意的是“不要依賴它!”。

在使用 AWS Lambda 時,利用執行上下文重用絕對是一種實踐(請參閱AWS Lambda 最佳實踐)。 但這不適用於並發執行,因為對於並發執行,會創建新容器並因此創建新上下文。 簡而言之,對於並發執行,如果一個處理程序更改了值,另一個將不會獲得新值。

正如我所見,沒有與 Lambda 相關的並發問題。 只有一個調用“擁有”容器。 第二次調用將獲得另一個容器(或者可能必須等到第一個容器空閑)。

但我沒有找到任何保證 Java 內存可見性問題不會發生。 在這種情況下,第一次調用所做的更改可能對第二次調用保持不可見。 或者第一次調用的更改將在第二次調用完成更改后寫入 RAM。

在大多數情況下,可見性問題的處理方式與並發問題相同。 因此,我建議開發 Lambda 函數線程安全(或同步)。 至少只要 AWS 不給我們保證,他們就會在每次調用后做一些事情來將 CPU 狀態刷新到內存中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM