微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批量事务同步到 Tinkerpop 图的一种方式

如何解决批量事务同步到 Tinkerpop 图的一种方式

我有一个系统 (Cassandra),其中包含我希望与启用 Tinkerpop 的商店单向“同步”的数据(我使用 AWS Neptune)。我所说的单向同步是指数据只会通过从真实来源到图存储的同步过程进行更新,并且对于图存储的用户来说是只读的。

事实来源拥有相对较小的数据集,当构建为图形时,它包含

我正在研究以下两种方法

A) 使用 Neptune Bulk Loader

  1. 每当真实来源发生变化时,将所有数据作为快照转储到文件中(将来可能会使用变化事件进行增量)
  2. 从图形存储中读取所有感兴趣的数据并计算要更新插入的节点和顶点
  3. 将所有节点和顶点写入 csv 文件并将它们加载到 Neptune 中

优点

  • 将数据加载到 Neptune 的最快方法

缺点

  • 不安全:如果批量加载中途失败,图形存储将处于不一致状态

B) 与 Tinkerpop SessionedClient

一起使用会话
  1. 每当真实来源发生变化时,将所有数据作为快照转储到文件中(将来可能会使用变化事件进行增量)
  2. 从图形存储中读取所有感兴趣的数据并计算要更新插入的节点和顶点。
  3. 使用单个会话发送批量 Gremlin 查询以更新和删除节点和顶点

优点

  • 安全:由于在整个同步过程中使用同一个会话,如果一个 Gremlin 查询失败,一切都会回滚

缺点

  • script-only: SessionedClient only allows Gremlin scripts,所以我不能使用字节码,我必须连接字符串来制作 Gremlin 脚本。不理想,但似乎有效。
  • 比散装装载机慢
  • 10-minute limit:通过 Neptune 将同步限制为 10 分钟,会话最多只能打开 10 分钟。由于数据的大小,我认为加载时间不会超过 10 分钟。

我用小数据集尝试了这两个选项。我还尝试使用常规的单请求一个事务 java 客户端,但在单个请求中发送所有更改并不适合未来。我说的对吗?

我即将开始对方法 B 进行产品化,我想知道是否有任何我应该注意的陷阱或我没有考虑过的其他选项?

解决方法

一些想法 - 您已经很好地思考了一些利弊。

  1. 对于 Neptune,如果您经常进行大量写入以非 upsert 方式添加数据,那么批量加载器是一个不错的选择。但是,正如您所注意到的,批量加载器的语义是“尽你所能”,要么加载每个有效的 CSV 行,要么在发现一行无效时立即失败。如果您可以通过筛选提前保证您的数据是干净的,那么批量加载程序可能仍然是一个不错的选择。

  2. Gremlin Sessions 使您可以更好地控制交易,但正如您目前所指出的,查询必须以文本形式发送。但是,在 TinkerPop 3.5.0 版本中,添加了对 ByteCode 事务的支持。最初用于 Java 客户端,其他人很快就会跟进。 Node 已经在开发中了,希望 Python 很快就可以使用了。一旦 Amazon Neptune 升级到 TinkerPop 3.5.x 级别,您将能够利用新的 ByteCode 事务语法/语义。请注意,会话的 10 分钟限制适用于会话空闲时。任何活动都会将计时器再次重置为 10 分钟。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。