amazon-web-services - 仅将列入白名单的项目写入 DynamoDB
问题描述
我有一组(~1.000.000)可以发送消息的设备,每个设备都有一个 ID 并且可以发送多条消息。设备的一个子集(约 10.000 个)应该能够使用我的服务,并且 ID 被放入白名单(DynamoDB 表)中。给定持续不断的消息流,我只希望将白名单中的一次保留在 DynamoDB 表中。
我一直在看的东西如下:
- 天真的方法是在 lambda 将数据写入 DynamoDB 时在代码中进行过滤,鉴于我首先需要查询白名单表以检查我可以写入哪些消息,因此不确定这将如何扩展。
- 我想使用 DynamoDB 条件写入(或者如果有其他一些智能功能)来指定“仅当它存在于白名单中时才将此项写入表”并让 DynamoDB 引擎负责过滤。
我的问题是在 DynamoDB 中是否有一些聪明的方法可以做到这一点?
解决方案
这对 DynamoDB 既是福也是祸——起初,它是一种痛苦,但不久之后,DDB 的简单性开始大放异彩——你可以在很短的时间内学习它的整个 API。
每个问题都是不同的,您在问题中提出了一些问题,所以我只提供一些希望对您有所帮助的观点:
- 您不能在 DDB 中查询/引用另一个表,因此没有“聪明”的方法可以做到这一点。
- DDB 非常快,所以我不会担心数据库端的扩展。
- 在写之前查询是一个完全可以接受的模型,只要确保你有一个有效的索引并且你正在使用
GetItem
或者Query
- 换句话说,不要使用Scan
. - 如果您真的想最小化调用,那么您可以考虑创建一个简单的白名单 ID 内存缓存。这可能会导致扩展复杂性,具体取决于您的基础架构,但这很容易解决。如果这是您正在考虑的事情,那么我建议您将 DDB Streams 视为一种确保缓存是最新的方法。但老实说,除非您确实遇到吞吐量问题,否则此选项将是矫枉过正。
推荐阅读
- matlab - 使用 imagesc 和固定轴映射
- php - 如何在 HTML 电子邮件中调用 PHP 函数
- macos - 为什么 Xcode 与 Target 成员不匹配?
- shell - socat:是否可以将接收到的消息在服务器端(unix 域套接字)传递给函数?
- angularjs - 如何获取动态添加指令的元素值
- java - Android Gradle 中的版本依赖冲突
- flutter - Flutter 1.5 - 有没有办法更新资产文件夹中的文件?
- aws-lambda - 如何引用 SAM 模板中定义的角色?
- javascript - 如何在 Vue.js 中将搜索查询框合并到 api 调用中
- c++ - 如果使用 WS_POPUP 样式创建 Window,则永远不会传递 WM_PAINT 消息