AWS Neptune数据库中的多租户

时间:2019-12-06 22:40:07

标签: gremlin amazon-neptune

我是海王星的新手。 在Neptune数据库中支持多租户的最佳方法是什么?
要求:
1.支持数据库中的数千个租户(一个集群)
2.避免由于租户筛选而使查询变得过于复杂
3.良好的性能(如果有一种方法可以使用数据分区来缩短查询时间)
4.安全-难以出错,将导致跨租户访问。

2 个答案:

答案 0 :(得分:0)

在非生产环境中,Gremlin partition strategy对我来说足够了。顶点和边共存于同一Gremlin簇中,它们具有区分它们的属性,在我的情况下,我使用了BitmapFactory.decodeStream属性。

然后,每次我从工厂请求遍历时,都在Java代码中使用分区策略。

_env

使用这些遍历将自动确定您分区的范围。但是,最大的麻烦是,您需要记住在从控制台进行查询时手动添加对分区的引用(实际上是任何不使用分区策略机制的内容),例如

private GraphTraversalSource buildReadOnlyTraversal() { log.debug("building read-only traversal"); return AnonymousTraversalSource.traversal() .withRemote(DriverRemoteConnection.using(getReadOnlyCluster())) .withStrategies(buildPartitionStrategy(), buildReadOnlyStrategy()); } private PartitionStrategy buildPartitionStrategy() { var env = this.properties.getEnvironmentPartition(); log.info("building partition strategy for environment={}", env); return PartitionStrategy.build() .partitionKey(ENVIRONMENT_PARTITION_KEY) .writePartition(env) .readPartitions(env) .create(); }

我认为这符合您的前2个条件,我无法对此发表评论。要点4,是的,这不是应用程序代码的问题,当手动修改图形时,错误更有可能发生。

答案 1 :(得分:0)

我想出了解决此问题的方法。我这样更改了GraphTraversal的一些现有功能。

setEnvironment = (g: GraphTraversalSource<GraphTraversal>, ENV: string) => {
  const bindGraphTraversal = (t: GraphTraversal): GraphTraversal => {
    const V = t.V.bind(t);
    const addV = t.addV.bind(t);
    const addE = t.addE.bind(t);
    t.V = (...args: any[]) => V(...args).has('_env', ENV);
    t.addV = (...args: any[]) => addV(...args).property('_env', ENV);
    t.addE = (...args: any[]) => addE(...args).property('_env', ENV);
    return t;
  }

  const addV = g.addV.bind(g);
  const addE = g.addE.bind(g);
  const V = g.V.bind(g);
  const E = g.E.bind(g);
  g.addV = (...args: any[]) => bindGraphTraversal(addV(...args).property('_env', ENV));
  g.addE = (...args: any[]) => bindGraphTraversal(addE(...args).property('_env', ENV));
  g.V = (...args: any[]) => bindGraphTraversal(V(...args).has('_env', ENV));
  g.E = (...args: any[]) => bindGraphTraversal(E(...args).has('_env', ENV));
  return g;
}

然后像这样重新分配图遍历对象

g = setEnvironment(g, 'my-environment');

这将在创建顶点或边缘时自动添加属性_env。并从查询中过滤_env

虽然这不是一个合适的解决方案,但是我们可以以此创建多个图形环境。