繁体   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