簡體   English   中英

AWS DynamoDB 和 Lambda:掃描優化/性能

[英]AWS DynamoDB and Lambda: Scan optimizations / performance

為了存儲 api-gateway websocket-connections,我使用了一個 dynamoDB 表。 發布到存儲連接時,我通過以下方式檢索 lambda 函數中的連接:

const dynamodb = new DynamoDB.DocumentClient();
const { Items, Count } = await dynamodb.scan({ TableName: 'Websocket' }).promise();

// post to connections

這不是很快。 查詢大約需要 400 - 800 毫秒,我認為這可能會更好。 我可以在我的實現上改變一些東西,或者是否有另一個 aws-service 更適合存儲關於 websocket-connection 的這些微小信息(它實際上只是一個小的連接 ID 和用戶 ID)?

它與 dynamodb 無關,如果您對從磁盤讀取的任何數據庫進行掃描,則需要花費時間和金錢。

您可以使用以下任何解決方案來實現您正在做的事情。

  1. 與其將所有 websocket id 存儲為單獨的行,不如考慮在其中存儲 id 的單個記錄,以便您可以執行單個查詢(而不是掃描)並繼續。

    缺點

    一種。 對同一行的多次寫入將導致競爭條件。 並且很少讀取可能會丟失,您可以使用條件寫入來更新記錄來解決此問題(具有始終增加的版本,並且僅當db中的版本=您從db讀取的版本時才更新記錄)

    dynamodb 中單個文檔的大小有限制。 截至目前,它是 400kb。

  2. 將 websocket id 存儲為單獨的行,但按不同的鍵將它們分組,並在這些鍵上創建二級索引。 將密鑰存儲在一行中。 在執行 fetch 時,首先獲取所有相關組,然后查詢(而不是掃描)該組的所有項目。 它不會完全解決您的問題,但您可以做一些有趣的事情,例如,假設有 10 個組,每秒發送 1 個組的消息。 這將確保您的消息發送基礎設施的負載也是平衡的。 並且您可以隨着用戶的增加而不斷增加組的數量。

  3. 將 id 保存在像 aws 彈性緩存這樣的緩存中,並在使用 aws lambda 和 dyanmodb 流在 dynamodb 中創建新條目時添加/刪除 id。 它將確保您閱讀速度很快。 同時,如果緩存出現故障,您可以使用 dynamodb 通過對 dynamodb 進行掃描來再次填充它。

    缺點:

    一種。 要維護的額外組件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM