我想在我的AWS lambda函數中使用Postgresql作爲數據庫,但是我擔心性能。在AWS lambda等無狀態FaaS上使用PostgreSQL是個不錯的主意?
我擔心Lambdas是無狀態的,只存在於它們執行時,所以我想象每次Lambda被觸發時它都會嘗試啓動一個全新的PG連接。
我不確定這是否會降低性能或以某種方式導致過時連接的問題。任何人都知道更多關於此?
我知道DynamoDB更符合Lambda,但我確實需要一個關係數據庫,但同時還需要Lambda的可擴展性。
我想在我的AWS lambda函數中使用Postgresql作爲數據庫,但是我擔心性能。在AWS lambda等無狀態FaaS上使用PostgreSQL是個不錯的主意?
我擔心Lambdas是無狀態的,只存在於它們執行時,所以我想象每次Lambda被觸發時它都會嘗試啓動一個全新的PG連接。
我不確定這是否會降低性能或以某種方式導致過時連接的問題。任何人都知道更多關於此?
我知道DynamoDB更符合Lambda,但我確實需要一個關係數據庫,但同時還需要Lambda的可擴展性。
您可以使用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分鐘運行一次)
很棒的回答 - 確實非常有幫助! – Ryan
Lambda上每個任務需要運行多長時間?我認爲這隻在db連接時間佔整個時間的很大比例時才重要,即便如此,如果您需要RDBMS功能,那也許是值得付出的代價。但首先我會嘗試量化影響。 –
@DavidAldridge通常一個lambda函數需要100-200毫秒的MAX,大約2個選擇和1插入每個請求。但我期待高併發性。你會推薦使用這個名爲PostgREST的項目來繞過傳統的連接握手嗎? – Ryan
處理可能的連接限制,您可能還想查看[PgBouncer](https://wiki.postgresql.org/wiki/PgBouncer)的連接池。 –