DynamoDB 流是否适合此用例?
Is DynamoDB streams the right option for this use case?
我有一个 DynamoDB table,其中包含将被许多应用程序读取的键值对。在启动时,每个应用程序将读取整个 table 并将其缓存在内存中。
我要解决的问题是,如果 DynamoDB table 中的一个或多个项目已被修改,让应用程序更新它们的缓存。
DynamoDB 流最初似乎是解决问题的正确方法。我已经按照 AWS 的建议使用 Kinesis Client Library (KCL) 实施了消费者。然而,在实现它的过程中,我遇到了一些让我相信我走错了路的问题。具体来说:
当我使用 KCL 创建一个新的消费者时,它会创建一个新的 DynamoDB table 来管理租约和检查点,这样当应用程序重新启动时,KCL 知道哪些记录已经被消费,哪些还没有。这不是我解决这个问题所需要的。在应用程序离线时创建的任何流记录都无关紧要,因为整个 table 在应用程序启动时被读取。
同一应用程序的多个实例同时 运行。他们每个人都需要收到 table 更新的通知。要在 KCL 中实现它,我需要为它们中的每一个分配一个唯一的应用程序名称。否则他们将共享租约 table,并且只有一个应用程序会收到通知。每个应用程序实例一个 table 似乎不正确。此外,我还需要一些东西来删除未使用的 tables.
我也使用低级别 API 实现了它。当只有一个分片时,这很好用。然而,我的实现不像 KCL 那样处理重新分片,因此它太脆弱了。对于我要解决的简单问题,必须实施重新分片处理似乎是错误的。
我开始考虑其他解决方案,例如:
正在实施一个在 table 更新时触发的 lambda 函数。该函数向 SNS 主题发送通知。消费者在该主题上创建 SQS 订阅并通过它收到通知。这个解决方案有太多我喜欢的活动部分。
让应用程序定期重新读取整个 table 并自行确定是否进行了更改。这个解决方案感觉有点原始,但似乎是最简单的。
到目前为止我考虑过的所有解决方案都有相当大的缺点。我错过了什么?
这取决于您的 KCL 如何推送到依赖的应用程序,但是
我相信SQS路径是正确的选择。
- 您可以添加无限数量的消费者而不会受到限制。
- 当您添加另一个依赖应用程序时,不需要更改您的 KCL 即可推送到它,新应用程序将简单地监视 SQS 队列。
- 您可以在问题发生时监控队列。
- 需要设置更多移动部件,但是一旦
Streams -> SNS -> SQS
管道就位,它基本上是防弹的。
只是我的 2¢。
如今,带有订阅功能的 AWS AppSync GraphQL API 可能是支持此类应用程序的最简单方法,移动部件数量最少。
每当您的某个应用程序启动时,它会使用 Amplify framework or AppSync SDK 连接到您的 AppSync GraphQL API 并订阅其感兴趣的更新。然后每当应用程序更新 table 通过您的 GraphQL API,您的所有其他应用程序将收到更改通知,以及相关的更改数据。
AppSync 开箱即用地与 DynamoDB 很好地集成,允许您生成带有适当索引的 DynamoDB tables 和 GraphQL,或者如果您愿意,可以从现有的 DynamoDB tables 生成 GraphQL。 Amplify 甚至可以帮助您在更高级别自动生成 AppSync GraphQL API,并使用其 GraphQL transformers 关联 DynamoDB tables、索引、实体关系等类似 elasticsearch 搜索功能。 =13=]
我有一个 DynamoDB table,其中包含将被许多应用程序读取的键值对。在启动时,每个应用程序将读取整个 table 并将其缓存在内存中。
我要解决的问题是,如果 DynamoDB table 中的一个或多个项目已被修改,让应用程序更新它们的缓存。
DynamoDB 流最初似乎是解决问题的正确方法。我已经按照 AWS 的建议使用 Kinesis Client Library (KCL) 实施了消费者。然而,在实现它的过程中,我遇到了一些让我相信我走错了路的问题。具体来说:
当我使用 KCL 创建一个新的消费者时,它会创建一个新的 DynamoDB table 来管理租约和检查点,这样当应用程序重新启动时,KCL 知道哪些记录已经被消费,哪些还没有。这不是我解决这个问题所需要的。在应用程序离线时创建的任何流记录都无关紧要,因为整个 table 在应用程序启动时被读取。
同一应用程序的多个实例同时 运行。他们每个人都需要收到 table 更新的通知。要在 KCL 中实现它,我需要为它们中的每一个分配一个唯一的应用程序名称。否则他们将共享租约 table,并且只有一个应用程序会收到通知。每个应用程序实例一个 table 似乎不正确。此外,我还需要一些东西来删除未使用的 tables.
我也使用低级别 API 实现了它。当只有一个分片时,这很好用。然而,我的实现不像 KCL 那样处理重新分片,因此它太脆弱了。对于我要解决的简单问题,必须实施重新分片处理似乎是错误的。
我开始考虑其他解决方案,例如:
正在实施一个在 table 更新时触发的 lambda 函数。该函数向 SNS 主题发送通知。消费者在该主题上创建 SQS 订阅并通过它收到通知。这个解决方案有太多我喜欢的活动部分。
让应用程序定期重新读取整个 table 并自行确定是否进行了更改。这个解决方案感觉有点原始,但似乎是最简单的。
到目前为止我考虑过的所有解决方案都有相当大的缺点。我错过了什么?
这取决于您的 KCL 如何推送到依赖的应用程序,但是 我相信SQS路径是正确的选择。
- 您可以添加无限数量的消费者而不会受到限制。
- 当您添加另一个依赖应用程序时,不需要更改您的 KCL 即可推送到它,新应用程序将简单地监视 SQS 队列。
- 您可以在问题发生时监控队列。
- 需要设置更多移动部件,但是一旦
Streams -> SNS -> SQS
管道就位,它基本上是防弹的。
只是我的 2¢。
如今,带有订阅功能的 AWS AppSync GraphQL API 可能是支持此类应用程序的最简单方法,移动部件数量最少。
每当您的某个应用程序启动时,它会使用 Amplify framework or AppSync SDK 连接到您的 AppSync GraphQL API 并订阅其感兴趣的更新。然后每当应用程序更新 table 通过您的 GraphQL API,您的所有其他应用程序将收到更改通知,以及相关的更改数据。
AppSync 开箱即用地与 DynamoDB 很好地集成,允许您生成带有适当索引的 DynamoDB tables 和 GraphQL,或者如果您愿意,可以从现有的 DynamoDB tables 生成 GraphQL。 Amplify 甚至可以帮助您在更高级别自动生成 AppSync GraphQL API,并使用其 GraphQL transformers 关联 DynamoDB tables、索引、实体关系等类似 elasticsearch 搜索功能。 =13=]