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

Любые идеи?


person ThanosG    schedule 18.10.2018    source источник
comment
Вам подходит какое-либо из приведенных ниже предложений?   -  person The-Big-K    schedule 24.10.2018
comment
Спасибо за вашу помощь, Катрик, я добавил комментарии в ответы ниже.   -  person ThanosG    schedule 24.10.2018


Ответы (2)


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

Документы: 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 между считывающими устройствами.

person The-Big-K    schedule 18.10.2018
comment
Спасибо за Ваш ответ! Я ищу способ применить стиль запросов к базе данных только для чтения, используя описанный выше подход. Это возможно? Спасибо. - person ThanosG; 22.10.2018
comment
См. Обновленный ответ и дайте мне знать, подходит ли это вашему варианту использования. - person The-Big-K; 22.10.2018
comment
Сервер ReaderEndpoint действительно потрясающий. Но когда я его использовал, я действительно мог запускать запросы addV. Я получил такой вывод: aws neptune describe-db-cluster --query 'DBClusters [? Engine == neptune]. [ReaderEndpoint]' --output text - person ThanosG; 24.10.2018
comment
@ThanosG Вы пробовали это в кластере с одним экземпляром или это был кластер с несколькими экземплярами? Конечные точки RO для кластеров с одним экземпляром будут указывать на сам писатель. Точка конечных точек RO исключает писателя только при наличии нескольких экземпляров в кластере. - person The-Big-K; 24.10.2018
comment
Это должно быть так. У меня есть только один. Решением было бы создать еще один, чтобы RO указывал на него? - person ThanosG; 25.10.2018

Есть несколько способов использования 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");
    }

Привет, Кельвин

person Kelvin Lawrence    schedule 21.10.2018
comment
Спасибо, Кевин, за ваш ответ. Не могли бы вы рассказать мне подробнее, как я могу ограничить доступ пользователей / приложений к конечной точке чтения с помощью удаленного доступа? Я также обновил свой вопрос. - person ThanosG; 22.10.2018
comment
Я обновил свой ответ, чтобы показать пример создания ReadOnlyStrategy из Java из клиентского приложения. Вместо того, чтобы использовать подход client.submit (), вы можете использовать подход удаленного подключения, который будет отправлять ваш запрос на сервер с использованием байтового кода Gremlin. - person Kelvin Lawrence; 22.10.2018
comment
Благодарю за ответ. Однако в настоящее время я не могу использовать вышеуказанный метод, так как мои запросы в настоящее время неизвестны. Итак, мой единственный способ - использовать client.submit (unknown_query). - person ThanosG; 24.10.2018