[英]Scan table an run an update script for 10M user on AWS
我正在使用包含超過 1000 萬用戶的AWS
Dynamodb
數據庫,我們在處理某些事件時出錯,並且我們確實以錯誤的方式保存了一些記錄。
我創建了一個腳本,通過 250 個批量掃描表來執行更新作業,我在本地運行它可以工作,並且需要 4 天才能完成孔數據庫,我遇到了AWS
session 的一些問題,每次登錄注銷時再次運行腳本在完成之前,我還會跟蹤另一個表中的記錄,所以當我重新啟動腳本時,它會從該記錄開始,而不是從頭開始。
每個人都很高興這項工作完成了,但這不是我來這里的原因,所以我的QUESTION
:
使用aws
服務的解決方案是什么,我可以在下次發生這種情況時構建它以使其faster
而不是在本地運行。
歡迎任何模式設計/解釋/建議。
AWS Lambda 能夠在功能上實現無限的水平擴展。 Lambda 最多可以執行 15 分鍾,因此您只需為 lambda 提供適量的工作,以便它可以在配置的超時時間內完成。 在這個 model 中,您已經有 250 個批處理大小,因此您可能只需要幾秒鍾而不是 15 分鍾來執行批處理。
接下來是一個問題,告訴您的 lambda 它的工作是什么部分。 SQS 在這里是一個很好的解決方案 - 您可以為每批工作推送一條 SQS 消息,並讓 AWS 為每條消息自動調用您的 lambda。
您還必須擴展您的 dynamo 數據庫集群,以便能夠跟上這些 lambda 能夠生成的大量讀寫操作,而不會影響生產。 您可以首先將 lambda 限制在較低的音量並增加 lambda function 的允許並發性,同時監控生產 SLI 以確保不會造成任何影響。
這種系統的成本相當低。 10M/250 = 40000 批; 如果每個批次都是一條消息並且是一個 lambda 調用,則需要 40000 次調用,並且至少 40000 次寫入、40000 次讀取和 40000 次 sqs 刪除(在失敗的情況下,消息將返回隊列進行重新處理,這非常適合您的情況,因為該操作聽起來是冪等的)。 If you're not using lambda or SQS for anything else, this should fit comfortably within the free tier of lambda/sqs (1M sqs operations; 1M lambda invokes; 400k GB/s of lambda runtime) unless your batch updates take more than 10每個秒。 或需要超過 1GB 的 memory。 基於 4 天/40000 個批次,聽起來您的批次運行時間不到 9 秒。
當您水平縮放時,這並不重要。 但還是值得思考的。 有些語言比其他語言快得多,當必須執行 40,000 批操作時,它會產生很大的不同。 最慢的是使用對aws
cli 的重復調用——每個調用都需要實例化整個 python 運行時,這有相當多的開銷。 Faster 是在 python 等解釋語言的一個進程中運行所有批次,因為至少那時您不必啟動 40,000 個進程而產生開銷。 但是您仍然需要在 python 層和 C 層之間轉換所有數據的開銷。 對於一項操作,這種開銷幾乎不會引起注意; 對於 40,000 個請求,開銷可能很大。 我假設諸如 Java 之類的性能更高的語言將提供類似的性能改進。 根據經驗,我可以說 Go 的 AWS 開發工具包的性能將大大優於 Python,並且可以很好地並行啟動。
AWS glue
可能是處理數據的好選擇 ( https://docs.aws.amazon.com/glue/latest/dg/add-job.html )
您可以從 dynamoDB( https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-full-table-copy-options/aws-glue.html )加載數據並使用 jupyter notebook一些非常簡單的 python 代碼來處理數據。
您甚至可以使用aws glue databrew
,它是一個可視化界面,讓您無需真正了解編程語言即可處理數據 ( https://aws.amazon.com/glue/features/databrew/ )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.