【问题标题】:How to add storage-level caching between DynamoDB and Titan?如何在 DynamoDB 和 Titan 之间添加存储级缓存?
【发布时间】:2016-04-09 22:45:17
【问题描述】:

我使用Titan/DynamoDB libraryAWS DynamoDB 用作Titan DB 图表的后端。我的应用程序读取量很大,我注意到 Titan 主要是针对 DynamoDB 执行查询请求。我正在使用 transaction- and instance-local cachesindexes 来减少我的 DynamoDB 读取单元和整体延迟。我想为我的所有EC2 实例引入一个一致的缓存层:DynamoDB 和我的应用程序之间的读/写缓存,用于存储查询结果、顶点和边。

我看到了两种解决方案:

  1. 隐式缓存直接由 Titan/DynamoDB 库完成。像 ParallelScanner could be changed 这样的类首先从 AWS ElastiCache 读取。必须将更改应用于读写操作以确保一致性。
  2. 显式缓存在调用 Titan/Gremlin API 之前由应用完成。

第一个选项似乎是更细粒度、跨领域和通用的。

  • 这样的东西已经存在了吗?也许用于其他存储后端?
  • 这是否存在不存在的原因?图形数据库应用程序的读取量似乎非常大,因此跨实例缓存似乎是加速查询的一个非常重要的功能。

【问题讨论】:

  • 我假设您尝试过让 Titan 的缓存更大?什么用例建议引入另一个级别的间接和延迟?
  • 这只解决了一个 Gremlin 服务器实例的问题,并没有解决跨实例缓存一致性问题。
  • @Sebastian:从 ElastiCache 读取比从 DynamoDB 读取快大约十倍。我的应用程序读起来非常繁重(读:写率约为 100:1)。如果 Titan 的实例本地缓存中不存在数据,我想从 ElastiCache 而不是 DynamoDB 中获取数据。我建议的 ElastiCache 层适用于所有 EC2/Titan 实例。如果实例 A 更新顶点,它将使 ElastiCache 条目无效/更新。后续从实例 B 获取的涉及该顶点的信息将更新缓存。

标签: caching amazon-dynamodb graph-databases titan amazon-elasticache


【解决方案1】:

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

关于隐式缓存,您可以在 DynamoDB 之上添加一个缓存层。例如,您可以在 DynamoDB 之上使用 API Gateway 实现缓存,也可以使用 Elasticache。无论哪种方式,您都需要想办法使查询/扫描页面无效。插入/删除项目会导致页面边界发生变化,因此需要考虑一下。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2016-05-10
    • 2013-09-10
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多