Gremlin ReadOnly Поддержка транзакций

Я пытаюсь настроить транзакцию для клиента 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()");

Я знаю, что вы можете ограничить эти типы запросов со стороны сервера. Но возможно ли это и со стороны клиента? Я также не уверен, что это правильный подход к этой проблеме.

Изменить: я общаюсь удаленно с Gremlin Server через WebSocket, представив "сценарии".
С Java я настраиваю кластер как:

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

А затем с помощью клиента для отправки запросов:

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

Я знаю о ReadOnlyStrategy, которую поддерживает Graph. Но я не нашел способ включить его с помощью вышеуказанного подхода, только из сценария конфигурации сервера. Есть ли другой способ ограничить представленный "запрос"?

Мой сервер настроен с помощью этого скрипта groovy по умолчанию:

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

И мой клиент отправляет такие запросы:

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

Есть идеи?

2 ответа

Решение

Ручная логика транзакций с использованием .tx() в настоящее время не поддерживается в Нептуне.

Документы: https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html -> Сделки

И, как упомянул Кельвин в своем ответе, вы всегда можете заставить свое приложение взаимодействовать с конечной точкой читателя кластера, которая позволяет выполнять только операции только для чтения. Вы можете получить конечную точку считывателя, просмотрев сведения о кластере с консоли, или получить конечную точку программно с помощью 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 между считывателями.

Существует несколько способов использования Neptune, которые позволяют применять семантику стиля "только для чтения" для данного варианта использования. Можно было бы использовать стратегию TinkerPop ReadOnly. Другой - разрешить пользователю / приложению доступ только к конечной точке чтения кластера, а не к конечной точке модуля записи.

Не могли бы вы рассказать немного больше о вашем конкретном случае использования?

ОБНОВЛЕНО: Вот пример создания ReadOnlyStrategy с использованием Java из клиентского приложения:

// 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");
    }

Ура, Кельвин

Другие вопросы по тегам