AWS Lambda + Tinkerpop/Gremlin + TitanDB для EC2 + AWS DynamoDB в облаке
Я пытаюсь выполнить следующий поток:
пользователь нажимает на AWS Gateway (REST),
запускает AWS Lambda,
который использует Tinkerpop/Gremlin подключается к
TitanDB на EC2, который использует
AWS DynamoDB в облаке (не на EC2) в качестве бэкэнда.
Прямо сейчас мне удалось создать полностью рабочий экземпляр TitanDB на EC2, который хранит данные в DynamoDB в облаке. Я также могу подключиться из AWS Lambda к EC2 через Tinkerpop/Gremlin, НО только так:
Cluster.build()
.addContactPoint("10.x.x.x") // ip of EC2
.create()
.connect()
.submit("here I type my query as string and it will work");
И это работает, однако я настоятельно предпочитаю использовать "Criteria API" (GremlinPipeline) вместо простого языка Gremlin. Другими словами, мне нужен ORM или что-то в этом роде. Я знаю, что Tinkerpop включает это. Я понял, что мне нужен объект класса Graph. Вот что я попробовал:
Graph graph = TitanFactory
.build()
.set("storage.hostname", "10.x.x.x")
.set("storage.backend", "com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager")
.set("storage.dynamodb.client.credentials.class-name", "com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
.set("storage.dynamodb.client.credentials.constructor-args", "")
.set("storage.dynamodb.client.endpoint", "https://dynamodb.ap-southeast-2.amazonaws.com")
.open();
Тем не менее он выдает "Не удалось найти класс реализации: com.amazon.titan.diskstorage.dynamodb.DynamoDBStoreManager". Конечно, компьютер работает правильно, так как IntelliJ IDEA также не может его найти.
Мои зависимости:
//
// aws
compile 'com.amazonaws:aws-lambda-java-core:+'
compile 'com.amazonaws:aws-lambda-java-events:+'
compile 'com.amazonaws:aws-lambda-java-log4j:+'
compile 'com.amazonaws:aws-java-sdk-dynamodb:1.10.5.1'
compile 'com.amazonaws:aws-java-sdk-ec2:+'
//
// database
// titan 1.0.0 is compatible with gremlin 3.0.2-incubating, but not yet with 3.2.0
compile 'com.thinkaurelius.titan:titan-core:1.0.0'
compile 'org.apache.tinkerpop:gremlin-core:3.0.2-incubating'
compile 'org.apache.tinkerpop:gremlin-driver:3.0.2-incubating'
Какова моя цель: иметь полностью работающий объект Graph
В чем моя проблема: у меня нет класса DynamoDBStoreManager, и я не знаю, какую зависимость я должен добавить.
Мой дополнительный вопрос: почему подключение через класс Cluster требует только IP и работает, а TitanFactory требует свойств, подобных тем, которые я использовал на gremlin-server в EC2? Я не хочу создавать второй сервер, я просто хочу подключиться к нему как клиент и получить объект Graph.
РЕДАКТИРОВАТЬ: После добавления распознавателя, он строит, в выводе я получаю несколько:
13689 [TitanID (0) (4) [0]] WARN com.thinkaurelius.titan.diskstorage.idmanagement.ConsistentKeyIDAuthority - исключение временного хранилища при получении блока идентификатора - повторная попытка в PT2.4S: com.thinkaurelius.titan.diskstorage.TeoraryBackendception Написал заявку для блока идентификаторов [1, 51) в PT0.342S => слишком медленно, порог: PT0.3S
и выполнение зависает в методе open(), поэтому не позволяет мне выполнять какие-либо запросы.
1 ответ
Для DynamoDBStoreManager
класс, вам понадобится эта зависимость:
compile 'com.amazonaws:dynamodb-titan100-storage-backend:1.0.0'
Затем для проблемы DynamoDBLocal, попробуйте добавить этот решатель:
resolvers += "AWS DynamoDB Local Release Repository" at "http://dynamodb-local.s3-website-us-west-2.amazonaws.com/release"
Мне не совсем понятно, что это значит - "Criteria API" вместо простого языка Гремлин. Я предполагаю, что вы имеете в виду, что вы хотите взаимодействовать с графиком, используя Java, а не передавать Gremlin в виде строки на работающий сервер Titan/Gremlin. Если это так, то вам вообще не нужно запускать сервер Titan/Gremlin (шаг 4 выше). Напишите программу AWS Lambda (шаг 2-3 выше), которая создает прямое соединение с клиентом Titan через TitanFactory
где все свойства конфигурации Titan предназначены для вашего экземпляра DynamoDB (шаг 5 выше).