我有一个 DynamoDB 表,其中包含将由许多应用程序读取的键值对。在启动时,每个应用程序将读取整个表并将其缓存在内存中。
我要解决的问题是,如果 DynamoDB 表中的一个或多个项目已被修改,则让应用程序更新其缓存。
DynamoDB 流最初似乎是解决问题的正确方法。我已经按照 AWS 的建议使用 Kinesis 客户端库 (KCL) 实现了消费者。然而,在实施它时,我遇到了一些问题,让我相信我走错了路。具体来说:
当我使用 KCL 创建一个新的消费者时,它会创建一个新的 DynamoDB 表来管理租约和检查点,这样当应用程序重新启动时,KCL 就会知道哪些记录已被使用,哪些没有。这不是我解决这个问题所需要的。应用程序离线时创建的任何流记录都无关紧要,因为在应用程序启动时会读取整个表。
同一应用程序的多个实例同时运行。他们每个人都需要收到表更新的通知。要在 KCL 中实现这一点,我需要为每个应用程序分配一个唯一的应用程序名称。否则,他们将共享租用表,并且只有一个应用程序会收到通知。每个应用程序实例的一个表似乎不正确。此外,我还需要一些东西来删除未使用的表。
我还使用低级 API 来实现它。当只有一个分片时,它工作得很好。但是,我的实现不像 KCL 那样处理重新分片,所以它太脆弱了。对于我要解决的简单问题,必须实施重新分片处理似乎是错误的。
我开始考虑其他解决方案,例如:
实现一个在更新表时触发的 lambda 函数。该函数向 SNS 主题发送通知。消费者在该主题上创建 SQS 订阅并通过该订阅获得通知。这个解决方案有太多我喜欢的活动部件。
让应用程序定期重新读取整个表并确定自己是否进行了更改。这个解决方案感觉有点原始,但似乎是最简单的。
到目前为止,我考虑过的所有解决方案都有相当大的缺点。我错过了什么?