2017-06-17 122 views
3

假設我有這樣的代碼。AWS的併發行爲Lambda

public class MyHandler { 
    private Foo foo; 
    public void handler(InputStream request, OutputStream response, Context context) { 
     ... 
    } 
} 

富富負責創建池數據庫連接的服務。

我想了解它如何與AWS Lambda一起工作。如果我理解正確,foo會在多個調用中共享。第一個需要更多的時間,因爲它必須加載到容器中,隨後的將更快,因爲foo已經初始化。直到我的處理程序在閒置一段時間後才被踢出去,情況就會如此。

因此,對於順序調用,它是否會使用同一個對象,它是否可以訪問早期函數調用中創建的/ tmp?

平行調用怎麼樣?它是否會複製整個容器,因爲根據文檔,每個lambda函數應該在它自己的容器,它自己的資源和它自己的/ tmp中執行?

如果處理程序將在閒置後被踢出,Java中是否有一個回調函數可以調用以關閉所有打開的池連接?

回答

1

因此,對於順序調用,它是否會使用同一個對象,它是否可以訪問在早期函數調用中創建的/ tmp?

是的,它會使用同一個對象。是的,它可以訪問早期函數調用中創建的/tmp

平行調用怎麼樣?它會複製整個 容器,因爲根據文檔,每個lambda函數應該在其自己的容器中執行,它自己的資源和它自己的/ tmp?

並行調用將出現在單獨的容器中。一個容器一次只能處理一個調用。所以是整個容器將被複制,並且每個容器都有自己的/tmp

如果處理程序會活動後,被踢出,有沒有在Java中 回調函數,我可以打電話給關閉所有打開的 池連接?

不,沒有回調可以用來處理這個問題。當容器由於不活動而最終被移除時,您的功能將處於暫停狀態。

+0

因此,在並行調用的情況下,當容器發生重複時,通常會有創建數據庫連接的開銷?那意味着,爲AWS Lambda創建池式連接沒有用處? – Prabhat

+0

如果沒有足夠的容器已經啓動的並行執行的情況下,是的,會創建一個新的容器創建數據庫連接的開銷。如果您在一段時間內繼續使用並行調用,那麼這些容器將被重用,這意味着在處理程序之外創建數據庫連接有很好的理由。但是,如果您在Lambda函數內部使用連接池,我認爲您只希望該池的大小爲1. –

+0

謝謝。這清除了事情。基本上,它就像創建與數據庫的直接連接而不是混合數據庫。如果我的理解正確,則不能保證第二次調用將通過在並行環境中首次調用來訪問存儲在'/ tmp'中的數據,即使這兩次調用是連續的。 想知道'/ tmp'的真實用例 – Prabhat