【问题标题】:Gremlin ReadOnly Transactional supportGremlin 只读事务支持
【发布时间】:2018-10-18 18:52:02
【问题描述】:

我正在尝试为 Gremlin 客户端配置一个不允许任何变异查询(只读)的事务。

我知道这在 JanusGraph 或 Titan 及其 API 中是可能的(使用 buildTransaction() 作为 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 服务器进行远程通信。
在 Java 中,我将集群配置为:

Cluster cluster = 
    Cluster.build().addContactPoint(url).port(port).create();

然后使用客户端提交查询:

Client c= cluster.connect().init();
c.submit(query);

我知道 Graph 支持的 ReadOnlyStrategy。但是我还没有找到通过上述方法启用它的方法,只能从服务器配置脚本中找到。是否有另一种方法来限制提交的“查询”?

我的服务器配置了这个默认的 groovy 脚本:

globals << [g : graph.traversal()] // Could have used readOnly strategy here.

我的客户正在发送这样的查询:

c.submit("g.addV('test')"); // this should fail

有什么想法吗?

【问题讨论】:

  • 以下任何建议对您有用吗?
  • 感谢您的帮助 Kathrik,我在下面的答案中添加了 cmets。

标签: java gremlin tinkerpop3 amazon-neptune


【解决方案1】:

有几种使用 Neptune 的方法可以为给定的用例强制执行只读样式语义。一种是使用 TinkerPop 只读策略。另一种是只允许用户/应用程序访问集群的读取端点,而不是写入端点。..

您能否详细介绍一下您的具体用例?

更新:以下是使用 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");
    }

干杯, 开尔文

【讨论】:

  • 感谢凯文,您的回复。您能否告诉我更多关于如何通过远程方法限制用户/应用程序对读取端点的访问?我也更新了我的问题。
  • 我更新了我的答案,以展示从客户端应用程序从 Java 创建 ReadOnlyStrategy 的示例。您可以使用远程连接方法,而不是使用 client.submit() 方法,该方法将使用 Gremlin 字节码将您的查询发送到服务器。
  • 感谢您的回答。但是我目前无法使用上述方法,因为此时我的查询是“未知的”。所以我唯一的方法是使用 client.submit("unknown_query")。
  • 哇!这是ReadOnlyStrategy 可能与gremlin nodejs 库吗?
  • 应该是的。这是标准的 Gremlin 策略之一。
【解决方案2】:

Neptune 目前不支持使用 .tx() 的手动事务逻辑。

文档:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html -> 交易

正如 Kelvin 在他的回答中提到的,您始终可以让您的应用程序与集群的读取器端点通信,这样您就可以只执行只读操作。您可以通过从控制台查看集群详细信息来获取读取器端点,或者使用 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                                                                 |||
||+-----------------------------------+---------------------------------------------------------------------------------------+||

请注意,读取器端点在结果中以ReaderEndpoint 的形式提供。

更新: 如果您的集群中只有一个实例,则读取器和写入器端点都指向同一个实例。如果您想要一个真正的只读端点,您应该创建一个多实例集群,在这种情况下,读取器端点在读取器之间执行 DNS 循环。

【讨论】:

  • 感谢您的回答!我正在寻找一种方法来强制使用上述方法查询数据库的只读样式。这可能吗?谢谢。
  • 查看更新的答案,让我知道这是否适合您的用例。
  • ReaderEndpoint 服务器真的很棒。但是当我使用它时,我实际上可以运行 addV 查询。我得到了这样的输出: aws neptune describe-db-clusters --query 'DBClusters[?Engine==neptune].[ReaderEndpoint]' --output text
  • @ThanosG 您是在只有一个实例的集群上尝试过,还是在多实例集群上尝试过?单实例集群的 RO 端点将指向编写器本身。仅当集群中有多个实例时,RO 端点才会排除写入器。
  • 一定是这样。我只有一个。那么解决方案是再创建一个以便 RO 指向它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多