如何在 DynamoDB 和 Titan 之间添加存储级缓存?

How to add storage-level caching between DynamoDB and Titan?

我正在使用 Titan/DynamoDB library to use AWS DynamoDB as a backend for my Titan DB graphs. My app is very read-heavy and I noticed Titan is mostly executing query requests against DynamoDB. I am using transaction- and instance-local caches and indexes to reduce my DynamoDB read units and the overall latency. I would like to introduce a cache layer that is consistent for all my EC2 实例:DynamoDB 和我的应用程序之间的 read/write-through 缓存用于存储查询结果、顶点和边。

我看到了两个解决方案:

  1. 隐式缓存 直接由 Titan/DynamoDB 库完成。 类 先点赞 ParallelScanner could be changed to read from AWS ElastiCache。必须将更改应用于读取和写入操作以确保一致性。
  2. 显式缓存 在调用 Titan 之前由应用程序完成/Gremlin API.

第一个选项似乎更细粒度、交叉和通用。

首先,ParallelScanner 并不是您需要更改的唯一内容。最重要的是,您需要进行的所有更改都在 DynamoDBDelegate 中(这是唯一进行低级别 DynamoDB API 调用的 class)。

关于隐式缓存,您可以在 DynamoDB 之上添加一个缓存层。例如,您可以在 DynamoDB 之上使用 API 网关实现缓存,或者您可以使用 Elasticache。无论哪种方式,您都需要找到一种使 Query/Scan 页面无效的方法。 Inserting/deleting 项目会导致页面边界发生变化,因此需要考虑一下。

显式缓存可能比隐式缓存更容易实现。抽象级别更高,因此根据您的传入写入,您可能更容易在应用程序级别决定缓存的遍历是否需要失效。如果您将图形应用程序视为另一项服务,则可以在服务级别缓存结果。

介于两者之间的一些东西也是可能的(但需要一些工作)。您可以继续使用 Titan 提供的 vertex/database 缓存,并使用与您写入列的频率一致的低 TTL 值。或者,您可以进一步采用缓存方法并执行以下操作。

  1. 在边缘存储上启用 DynamoDB 流。
  2. 使用 Lambda 函数将边缘存储更新流式传输到 Kinesis Stream。
  3. 在与每个 Gremlin 服务器实例上的 Gremlin 服务器相同的 JVM 中使用带有边缘存储更新的 Kinesis Stream。您需要检测 Titan 中的数据库级缓存以使用 Kinesis 流并在每个 Titan 实例中适当地使缓存列无效。