2017-07-18 30 views
1

我想在我的AWS lambda函數中使用Postgresql作爲數據庫,但是我擔心性能。在AWS lambda等無狀態FaaS上使用PostgreSQL是個不錯的主意?

我擔心Lambdas是無狀態的,只存在於它們執行時,所以我想象每次Lambda被觸發時它都會嘗試啓動一個全新的PG連接。

我不確定這是否會降低性能或以某種方式導致過時連接的問題。任何人都知道更多關於此?

我知道DynamoDB更符合Lambda,但我確實需要一個關係數據庫,但同時還需要Lambda的可擴展性。

+0

Lambda上每個任務需要運行多長時間?我認爲這隻在db連接時間佔整個時間的很大比例時才重要,即便如此,如果您需要RDBMS功能,那也許是值得付出的代價。但首先我會嘗試量化影響。 –

+0

@DavidAldridge通常一個lambda函數需要100-200毫秒的MAX,大約2個選擇和1插入每個請求。但我期待高併發性。你會推薦使用這個名爲PostgREST的項目來繞過傳統的連接握手嗎? – Ryan

+0

處理可能的連接限制,您可能還想查看[PgBouncer](https://wiki.postgresql.org/wiki/PgBouncer)的連接池。 –

回答

2

您可以使用AWS lambda的container execution model。當調用lambda時,AWS會旋轉容器以在處理函數中運行代碼。因此,如果您在處理函數外定義PG連接,它將在Lambda函數的調用中共享。你可以在上面的鏈接中找到它。

您的Lambda函數代碼中的任何聲明(處理程序代碼外部,請參閱編程模型)都將保持初始化狀態,以便在函數再次調用時提供額外的優化。例如,如果您的Lambda函數建立數據庫連接,而不是重新建立連接,則在隨後的調用中使用原始連接。您可以在代碼中添加邏輯,以在創建連接之前檢查連接是否已經存在。

const pg = require('pg'); 
const client = new pg.Client(<connection_string>); 

exports.handler = (event, context, cb) => { 
    client.query('SELECT * FROM users WHERE ', (err, users) => { 
    // Do stuff with users 
    cb(null); // Finish the function cleanly 
}); 
}; 

參考this博客文章。

但有一個警告。

當您編寫Lambda函數代碼時,請不要認爲AWS Lambda始終重用容器,因爲AWS Lambda可能會選擇不重用容器。根據各種其他因素,AWS Lambda可能會簡單地創建一個新容器,而不是重新使用現有容器。

另外,您可以創建預定作業來預熱lambda函數。 (每5分鐘運行一次)

+0

很棒的回答 - 確實非常有幫助! – Ryan

相關問題