Gremlin 只读事务支持
Gremlin ReadOnly Transactional support
我正在尝试为不允许任何变异查询(只读)的 Gremlin 客户端配置事务。
我知道这在 JanusGraph 或 Titan 中是可能的 API(buildTransaction() as readOnly()),但是对于 TinkerPop 或 Neptune,我没有发现任何类似的东西。
我正在使用 java 基于脚本的客户端(会话):
Cluster cluster = Cluster.open();
Client client = cluster.connect('SessionID');
String mutatingQuery = "g.addV('Test')";
client.submit("g.tx().open()");
client.submit(mutatingQuery); // This should fail.
client.submit("g.tx().commit()");
我知道您可以从服务器端限制这些类型的查询。但这也可以从客户端进行吗?我也不确定这是否是解决此问题的正确方法。
编辑:
我正在通过 WebSocket 与 Gremlin 服务器进行远程通信,方法是提交 "scripts".
从 Java,我将集群配置为:
Cluster cluster =
Cluster.build().addContactPoint(url).port(port).create();
然后使用客户端提交查询:
Client c= cluster.connect().init();
c.submit(query);
我知道 Graph 支持的 ReadOnlyStrategy。但是我还没有找到通过上述方法启用它的方法,只能从服务器配置脚本中启用它。是否有另一种方法来限制提交 "query"?
我的服务器配置了这个默认的 groovy 脚本:
globals << [g : graph.traversal()] // Could have used readOnly strategy here.
我的客户正在发送这样的查询:
c.submit("g.addV('test')"); // this should fail
有什么想法吗?
Neptune 目前不支持使用 .tx()
的手动交易逻辑。
文档:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html -> 交易
正如 Kelvin 在他的回答中提到的,您始终可以让您的应用程序与集群的 reader 端点通信,这样您就可以只执行只读操作。您可以通过从控制台查看集群详细信息来获取 reader 端点,或者使用 Neptune SDK 以编程方式获取端点。
aws neptune describe-db-clusters --db-cluster-identifier \
neptunedbcluster-t0wz5xpqmiuc --region us-east-1 --output table
---------------------------------------------------------------------------------------------------------------------------------
| DescribeDBClusters |
+-------------------------------------------------------------------------------------------------------------------------------+
|| DBClusters ||
|+-----------------------------------+-----------------------------------------------------------------------------------------+|
|| AllocatedStorage | 1 ||
|| BackupRetentionPeriod | 1 ||
|| ClusterCreateTime | 2018-10-16T04:17:23.384Z ||
|| DBClusterArn | arn:aws:rds:us-east-1:123123123123:cluster:neptunedbcluster-t0wz5xpqmiuc ||
|| DBClusterIdentifier | neptunedbcluster-t0wz5xpqmiuc ||
|| DBClusterParameterGroup | neptunedbclusterparametergr-q6eekezcpd04 ||
|| DBSubnetGroup | neptunedbsubnetgroup-dmcliosqke8b ||
|| DbClusterResourceId | cluster-AEFFOL3WFA7W5H7WL4QWEQWEQWE ||
|| EarliestRestorableTime | 2018-10-21T07:04:17.379Z ||
|| Endpoint | neptunedbcluster-t0wz5xpqmiuc.cluster-qweqweqwe.us-east-1.neptune.amazonaws.com ||
|| Engine | neptune ||
|| EngineVersion | 1.0.1.0 ||
|| HostedZoneId | ZUFXD4SLT2LS7 ||
|| IAMDatabaseAuthenticationEnabled | False ||
|| LatestRestorableTime | 2018-10-22T17:16:44.233Z ||
|| MasterUsername | admin ||
|| MultiAZ | False ||
|| Port | 8182 ||
|| PreferredBackupWindow | 06:52-07:22 ||
|| PreferredMaintenanceWindow | mon:09:33-mon:10:03 ||
|| ReaderEndpoint | neptunedbcluster-t0wz5xpqmiuc.cluster-ro-qweqweqwe.us-east-1.neptune.amazonaws.com ||
|| Status | available ||
|| StorageEncrypted | False ||
|+-----------------------------------+-----------------------------------------------------------------------------------------+|
||| AssociatedRoles |||
||+----------+----------------------------------------------------------------------------------------------------------------+||
||| RoleArn | arn:aws:iam::393993383537:role/RDS-2-Neptune-Demo-NeptuneBa-NeptuneLoadFromS3Role-1NKBKFMRK6L1G |||
||| Status | ACTIVE |||
||+----------+----------------------------------------------------------------------------------------------------------------+||
||| AvailabilityZones |||
||+---------------------------------------------------------------------------------------------------------------------------+||
||| us-east-1b |||
||| us-east-1c |||
||| us-east-1a |||
||+---------------------------------------------------------------------------------------------------------------------------+||
||| DBClusterMembers |||
||+------------------------------------------------------------+--------------------------------------------------------------+||
||| DBClusterParameterGroupStatus | in-sync |||
||| DBInstanceIdentifier | neptunedbinstance-owqd0npl6ar4 |||
||| IsClusterWriter | True |||
||| PromotionTier | 1 |||
||+------------------------------------------------------------+--------------------------------------------------------------+||
||| VpcSecurityGroups |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
||| Status | VpcSecurityGroupId |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
||| active | sg-01ab9e609e122c01b |||
||| active | sg-0723b9b248cbe20a3 |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
请注意,reader 端点在结果中作为 ReaderEndpoint
可用。
更新:
如果您的集群中只有一个实例,那么 reader 和 writer 端点都指向同一个实例。如果你想要一个真正只读的端点,你应该创建一个多实例集群,在这种情况下,reader 端点在 reader 之间执行 DNS 循环。
您可以通过多种方式使用 Neptune 为给定用例强制执行只读样式语义。一种是使用 TinkerPop ReadOnly Strategy。另一个是只允许 user/application 访问集群的读取端点而不是写入端点..
你能多说一下你的具体用例吗?
已更新:这是使用 Java 从客户端应用程序创建 ReadOnlyStrategy 的示例:
// Experiment with the ReadOnlyStrategy
g2 = g.withStrategies(ReadOnlyStrategy.instance());
try
{
g2.addV("shouldfail").iterate();
}
catch(Exception e)
{
System.out.println("Unable to add vertex as expected");
}
干杯,
开尔文
我正在尝试为不允许任何变异查询(只读)的 Gremlin 客户端配置事务。
我知道这在 JanusGraph 或 Titan 中是可能的 API(buildTransaction() as readOnly()),但是对于 TinkerPop 或 Neptune,我没有发现任何类似的东西。
我正在使用 java 基于脚本的客户端(会话):
Cluster cluster = Cluster.open();
Client client = cluster.connect('SessionID');
String mutatingQuery = "g.addV('Test')";
client.submit("g.tx().open()");
client.submit(mutatingQuery); // This should fail.
client.submit("g.tx().commit()");
我知道您可以从服务器端限制这些类型的查询。但这也可以从客户端进行吗?我也不确定这是否是解决此问题的正确方法。
编辑:
我正在通过 WebSocket 与 Gremlin 服务器进行远程通信,方法是提交 "scripts".
从 Java,我将集群配置为:
Cluster cluster =
Cluster.build().addContactPoint(url).port(port).create();
然后使用客户端提交查询:
Client c= cluster.connect().init();
c.submit(query);
我知道 Graph 支持的 ReadOnlyStrategy。但是我还没有找到通过上述方法启用它的方法,只能从服务器配置脚本中启用它。是否有另一种方法来限制提交 "query"?
我的服务器配置了这个默认的 groovy 脚本:
globals << [g : graph.traversal()] // Could have used readOnly strategy here.
我的客户正在发送这样的查询:
c.submit("g.addV('test')"); // this should fail
有什么想法吗?
Neptune 目前不支持使用 .tx()
的手动交易逻辑。
文档:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html -> 交易
正如 Kelvin 在他的回答中提到的,您始终可以让您的应用程序与集群的 reader 端点通信,这样您就可以只执行只读操作。您可以通过从控制台查看集群详细信息来获取 reader 端点,或者使用 Neptune SDK 以编程方式获取端点。
aws neptune describe-db-clusters --db-cluster-identifier \
neptunedbcluster-t0wz5xpqmiuc --region us-east-1 --output table
---------------------------------------------------------------------------------------------------------------------------------
| DescribeDBClusters |
+-------------------------------------------------------------------------------------------------------------------------------+
|| DBClusters ||
|+-----------------------------------+-----------------------------------------------------------------------------------------+|
|| AllocatedStorage | 1 ||
|| BackupRetentionPeriod | 1 ||
|| ClusterCreateTime | 2018-10-16T04:17:23.384Z ||
|| DBClusterArn | arn:aws:rds:us-east-1:123123123123:cluster:neptunedbcluster-t0wz5xpqmiuc ||
|| DBClusterIdentifier | neptunedbcluster-t0wz5xpqmiuc ||
|| DBClusterParameterGroup | neptunedbclusterparametergr-q6eekezcpd04 ||
|| DBSubnetGroup | neptunedbsubnetgroup-dmcliosqke8b ||
|| DbClusterResourceId | cluster-AEFFOL3WFA7W5H7WL4QWEQWEQWE ||
|| EarliestRestorableTime | 2018-10-21T07:04:17.379Z ||
|| Endpoint | neptunedbcluster-t0wz5xpqmiuc.cluster-qweqweqwe.us-east-1.neptune.amazonaws.com ||
|| Engine | neptune ||
|| EngineVersion | 1.0.1.0 ||
|| HostedZoneId | ZUFXD4SLT2LS7 ||
|| IAMDatabaseAuthenticationEnabled | False ||
|| LatestRestorableTime | 2018-10-22T17:16:44.233Z ||
|| MasterUsername | admin ||
|| MultiAZ | False ||
|| Port | 8182 ||
|| PreferredBackupWindow | 06:52-07:22 ||
|| PreferredMaintenanceWindow | mon:09:33-mon:10:03 ||
|| ReaderEndpoint | neptunedbcluster-t0wz5xpqmiuc.cluster-ro-qweqweqwe.us-east-1.neptune.amazonaws.com ||
|| Status | available ||
|| StorageEncrypted | False ||
|+-----------------------------------+-----------------------------------------------------------------------------------------+|
||| AssociatedRoles |||
||+----------+----------------------------------------------------------------------------------------------------------------+||
||| RoleArn | arn:aws:iam::393993383537:role/RDS-2-Neptune-Demo-NeptuneBa-NeptuneLoadFromS3Role-1NKBKFMRK6L1G |||
||| Status | ACTIVE |||
||+----------+----------------------------------------------------------------------------------------------------------------+||
||| AvailabilityZones |||
||+---------------------------------------------------------------------------------------------------------------------------+||
||| us-east-1b |||
||| us-east-1c |||
||| us-east-1a |||
||+---------------------------------------------------------------------------------------------------------------------------+||
||| DBClusterMembers |||
||+------------------------------------------------------------+--------------------------------------------------------------+||
||| DBClusterParameterGroupStatus | in-sync |||
||| DBInstanceIdentifier | neptunedbinstance-owqd0npl6ar4 |||
||| IsClusterWriter | True |||
||| PromotionTier | 1 |||
||+------------------------------------------------------------+--------------------------------------------------------------+||
||| VpcSecurityGroups |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
||| Status | VpcSecurityGroupId |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
||| active | sg-01ab9e609e122c01b |||
||| active | sg-0723b9b248cbe20a3 |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||
请注意,reader 端点在结果中作为 ReaderEndpoint
可用。
更新: 如果您的集群中只有一个实例,那么 reader 和 writer 端点都指向同一个实例。如果你想要一个真正只读的端点,你应该创建一个多实例集群,在这种情况下,reader 端点在 reader 之间执行 DNS 循环。
您可以通过多种方式使用 Neptune 为给定用例强制执行只读样式语义。一种是使用 TinkerPop ReadOnly Strategy。另一个是只允许 user/application 访问集群的读取端点而不是写入端点..
你能多说一下你的具体用例吗?
已更新:这是使用 Java 从客户端应用程序创建 ReadOnlyStrategy 的示例:
// Experiment with the ReadOnlyStrategy
g2 = g.withStrategies(ReadOnlyStrategy.instance());
try
{
g2.addV("shouldfail").iterate();
}
catch(Exception e)
{
System.out.println("Unable to add vertex as expected");
}
干杯, 开尔文