我是海王星的新手。
在Neptune数据库中支持多租户的最佳方法是什么?
要求:
1.支持数据库中的数千个租户(一个集群)
2.避免由于租户筛选而使查询变得过于复杂
3.良好的性能(如果有一种方法可以使用数据分区来缩短查询时间)
4.安全-难以出错,将导致跨租户访问。
答案 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
。
虽然这不是一个合适的解决方案,但是我们可以以此创建多个图形环境。