ASP.NET_SessionState表一直增長,已經達到18GB,並不是永遠刪除過期會話的跡象。AWS DynamoDB會話表不斷增長,無法刪除過期會話
我們試圖執行DynamoDBSessionStateStore.DeleteExpiredSessions,但它似乎沒有效果。
我們的系統運行良好,會話已創建,最終用戶不知道該問題。然而,它沒有任何意義,桌子不斷增長... 我們有三重檢查的權限/安全性,一切似乎是爲了。我們使用SDK 3.1.0版。還有什麼要檢查?
ASP.NET_SessionState表一直增長,已經達到18GB,並不是永遠刪除過期會話的跡象。AWS DynamoDB會話表不斷增長,無法刪除過期會話
我們試圖執行DynamoDBSessionStateStore.DeleteExpiredSessions,但它似乎沒有效果。
我們的系統運行良好,會話已創建,最終用戶不知道該問題。然而,它沒有任何意義,桌子不斷增長... 我們有三重檢查的權限/安全性,一切似乎是爲了。我們使用SDK 3.1.0版。還有什麼要檢查?
當你的表超過18 GB,這是相當大的(在這種情況下),它並沒有讓我感到驚訝,因爲在GitHub上查看DeleteExpiredSessions方法的代碼後,這不起作用。
下面是代碼:
public static void DeleteExpiredSessions(IAmazonDynamoDB dbClient, string tableName) { LogInfo("DeleteExpiredSessions"); Table table = Table.LoadTable(dbClient, tableName, DynamoDBEntryConversion.V1); ScanFilter filter = new ScanFilter(); filter.AddCondition(ATTRIBUTE_EXPIRES, ScanOperator.LessThan, DateTime.Now); ScanOperationConfig config = new ScanOperationConfig(); config.AttributesToGet = new List<string> { ATTRIBUTE_SESSION_ID }; config.Select = SelectValues.SpecificAttributes; config.Filter = filter; DocumentBatchWrite batchWrite = table.CreateBatchWrite(); Search search = table.Scan(config); do { List<Document> page = search.GetNextSet(); foreach (var document in page) { batchWrite.AddItemToDelete(document); } } while (!search.IsDone); batchWrite.Execute(); }
上述算法是在兩個部分執行。首先它執行一個Search
(表掃描)使用過濾器來識別所有過期的記錄。然後將它們添加到作爲第二步執行的DocumentBatchWrite
請求中。
由於您的表太大,在刪除單個記錄之前,表掃描步驟需要非常非常長的時間才能完成。基本上,上述算法對於小型表中的惰性垃圾收集很有用,但對於大型表不能很好地擴展。
我可以告訴的最好的是,執行此操作永遠不會超過表掃描,並且您可能正在消耗表的所有讀取吞吐量。
你一個可能的解決辦法是在自己的運行上述方法的一個稍作修改的版本。您可能想調用do-while循環內的DocumentBatchWrite
,以便在表掃描結束之前開始刪除記錄。
這將是這樣的:
public static void DeleteExpiredSessions(IAmazonDynamoDB dbClient, string tableName) { LogInfo("DeleteExpiredSessions"); Table table = Table.LoadTable(dbClient, tableName, DynamoDBEntryConversion.V1); ScanFilter filter = new ScanFilter(); filter.AddCondition(ATTRIBUTE_EXPIRES, ScanOperator.LessThan, DateTime.Now); ScanOperationConfig config = new ScanOperationConfig(); config.AttributesToGet = new List<string> { ATTRIBUTE_SESSION_ID }; config.Select = SelectValues.SpecificAttributes; config.Filter = filter; Search search = table.Scan(config); do { // Perform a batch delete for each page returned DocumentBatchWrite batchWrite = table.CreateBatchWrite(); List<Document> page = search.GetNextSet(); foreach (var document in page) { batchWrite.AddItemToDelete(document); } batchWrite.Execute(); } while (!search.IsDone); }
注:我沒有測試上面的代碼,但它僅僅是一個簡單的修改開源代碼,因此它應該正常工作,但需要進行測試,以確保分頁在正在掃描的記錄被刪除的表上正確工作。
我向AWS提交了一個拉取請求,以便在他們的代碼中修復此錯誤:https://github.com/aws/aws-dotnet-session-provider/pull/2 – JaredHatfield
謝謝@JaredHatfield,這是非常好的見解如何工作! – Ami
我們接受了拉取請求並將3.1.0.2版本推送到NuGet –