仅将列入白名单的项目写入DynamoDB

时间:2020-09-05 07:01:24

标签: amazon-web-services nosql amazon-dynamodb

我有一组(〜1.000.000)可以发送消息的设备,每个设备都有一个ID,可以发送多条消息。设备的一个子集(约10.000个)应该可以使用我的服务,并且ID被放入白名单(DynamoDB表)中。 给定恒定的消息流,我只希望白名单中的一次消息保留在DynamoDB表中。

我一直在看的东西如下:

  1. 天真的方法是在lambda将数据写入DynamoDB时在代码中进行过滤,如果我首先需要查询白名单表以检查随后可以写入哪些消息,则不确定这样做的扩展性。
  2. 我要使用的方式是使用DynamoDB条件写入(或如果有其他一些智能功能)来指定“仅当该项目存在于白名单中时才将该项目写入表中” DynamoDB引擎负责过滤。

我的问题是DynamoDB中是否存在一些智能方法?

2 个答案:

答案 0 :(得分:3)

这既是DynamoDB的福祉又是诅咒-起初是很痛苦的,但是过了一会儿DDB的简单性开始大放异彩-您可以在短时间内学习其整个API。

每个问题都不同,您在问题中已经问了几件事,所以我只提供一些希望对您有帮助的要点:

  • 您无法查询/引用DDB中的另一个表,因此没有“智能”方法。
  • DDB非常快,因此我不必担心在数据库端进行扩展。
  • 在编写之前进行查询是一个完全可以接受的模型,只需确保您有一个有效的索引并且使用的是GetItemQuery-换句话说,请不要使用Scan
  • 如果您真的想最小化呼叫,则可以考虑创建一个简单的白名单ID的内存中缓存。根据您的基础架构,这可能会导致扩展复杂性,但是可以轻松解决。如果您正在考虑这样做,那么我建议您查看DDB流,以确保高速缓存是最新的。但是,老实说,除非您确实遇到吞吐量问题,否则此选项可能会过大。

答案 1 :(得分:0)

通常,无法通过条件更新来完成所需的操作。有条件的更新只能引用要修改的同一项目的内容,而不能引用其他项目或其他表。这不是一个缺少的功能-这实际上是“免费”无法完成的:在DynamoDB写入项目时,作为同一操作的一部分,DynamoDB可以“免费”检查该项目的先前值。但是,没有“免费”方式读取不同项目。它基本上等于另一读取操作。因此,如果您想阅读其他项目,则可以通过读取操作自己完成此操作-DynamoDB的读取操作实际上无法比额外的读取请求更有效。

在某些情况下,如果每个ID仅保留一个项目,则有一个解决问题的简单方法-只需向该项目添加另一个属性(说明是否已列入白名单),然后在条件更新中使用此新属性即可。但是,如果每个ID包含很多项(例如,该ID是一个分区键,并且您还有一个额外的排序键),则无法执行此操作。 CQL(Cassandra和Scylla)的概念是“静态行”(属于整个分区,而不属于分区内的排序键的项),但DynamoDB不具有此功能。即使这样做,对静态行的额外读取也可能比其他读取便宜,但它不是免费的。