Amazon dynamodb DynamoDB streams是这个用例的正确选项吗?

Amazon dynamodb DynamoDB streams是这个用例的正确选项吗?,amazon-dynamodb,amazon-sqs,amazon-sns,amazon-kinesis,amazon-dynamodb-streams,Amazon Dynamodb,Amazon Sqs,Amazon Sns,Amazon Kinesis,Amazon Dynamodb Streams,我有一个DynamoDB表,其中包含许多应用程序将读取的键值对。启动时,每个应用程序将读取整个表并将其缓存在内存中 我试图解决的问题是,如果DynamoDB表中的一个或多个项被修改,那么让应用程序更新它们的缓存 DynamoDB streams最初似乎是解决这个问题的正确方法。我已经按照AWS的建议使用Kinesis客户端库(KCL)实现了消费者。然而,在实施过程中,我遇到了一些问题,这些问题让我相信我走错了方向。具体而言: 当我使用KCL创建一个新的使用者时,它会创建一个新的DynamoDB

我有一个DynamoDB表,其中包含许多应用程序将读取的键值对。启动时,每个应用程序将读取整个表并将其缓存在内存中

我试图解决的问题是,如果DynamoDB表中的一个或多个项被修改,那么让应用程序更新它们的缓存

DynamoDB streams最初似乎是解决这个问题的正确方法。我已经按照AWS的建议使用Kinesis客户端库(KCL)实现了消费者。然而,在实施过程中,我遇到了一些问题,这些问题让我相信我走错了方向。具体而言:

  • 当我使用KCL创建一个新的使用者时,它会创建一个新的DynamoDB表来管理租约和检查点,这样当应用程序重新启动时,KCL就会知道哪些记录已被使用,哪些未被使用。这不是我解决这个问题所需要的。应用程序脱机时创建的任何流记录都是无关的,因为整个表都是在应用程序启动时读取的

  • 同一应用程序的多个实例同时运行。他们每个人都需要得到表更新的通知。为了在KCL中实现这一点,我需要为每个应用程序分配一个唯一的应用程序名称。否则,他们将共享租约表,并且只有一个应用程序会得到通知。每个应用程序实例对应一个表似乎不正确。此外,我还需要一些东西来删除未使用的表

我还使用低级API实现了它。当只有一个碎片时,这很好。然而,我的实现不像KCL那样处理重新切分,所以它太脆弱了。对于我试图解决的简单问题,必须实现重新切分的处理,这似乎是错误的

我开始考虑其他的解决方法,如:

  • 实现一个lambda函数,该函数在更新表时被触发。该函数向SNS主题发送通知。消费者创建关于该主题的SQS订阅,并通过该主题获得通知。这个解决方案有太多我喜欢的活动部件

  • 让应用程序定期重新读取整个表,并自行确定是否进行了更改。这个解决方案感觉有点原始,但似乎是最简单的


到目前为止,我考虑的所有解决方案都有相当大的缺点。我遗漏了什么?

这取决于您的KCL如何推动相关应用程序,但 我相信SQS路径是正确的选择

  • 您可以在不受限制的情况下添加无限多的使用者
  • 当您添加另一个依赖应用程序时,无需更改KCL即可将其推送,新应用程序只需观察SQS队列
  • 您可以在问题发生时监视队列
  • 更多的移动部件需要安装,但一旦你有了
    Streams->SNS->SQS
    管道,它基本上是防弹的
就我的2¢

如今,带有订阅的AWS GraphQL API可能是支持此类应用程序的最简单方法,移动部件的数量最少

每当您的某个应用程序启动时,它都会使用框架或连接到您的AppSync GraphQL API,并订阅其感兴趣的更新。然后,每当应用程序通过GraphQLAPI更新表中的信息时,您的所有其他应用程序都将收到更改通知以及相关更改数据


AppSync与DynamoDB即用即用集成良好,允许您在GraphQL旁边生成具有适当索引的DynamoDB表,或者根据您的选择从现有DynamoDB表生成GraphQL。Amplify甚至可以帮助您在更高级别上自动生成AppSync GraphQL API,其中包含关联的DynamoDB表、索引、实体关系,以及更类似于elasticsearch的搜索功能。谢谢您的回复。你可能是对的,所以我把你的答案标记为正确的。尽管如此,许多活动部件仍然困扰着我。