配置Gremlin請求超時時間
圖數(shù)據(jù)庫GDB支持修改客戶端向圖數(shù)據(jù)庫GDB發(fā)送請求數(shù)據(jù)時的超時時間,您可以根據(jù)業(yè)務場景和數(shù)據(jù)量等修改超時時間。本文介紹不同語言環(huán)境中配置Gremlin請求超時時間的方法。
超時時間簡介
客戶端向圖數(shù)據(jù)庫GDB發(fā)送請求數(shù)據(jù)時,如果請求時間超過圖數(shù)據(jù)庫GDB設置的超時時間(默認為1800毫秒),則會發(fā)生超時現(xiàn)象,造成結果無法返回的現(xiàn)象。
超時時間的值為Long類型,單位為毫秒。
建議您不要配置過大的超時時間。
當客戶端和圖數(shù)據(jù)庫GDB的連接在請求超時前斷開時,會導致新的請求不生效。
使用各種語言配置超時時間
以下介紹各語言接入使用scripts請求的超時時間配置,示例配置超時時間為5000毫秒。
Java
在客戶端安裝Java和Maven工具。
執(zhí)行如下命令,安裝Java(以1.8.0版本為例)。
sudo yum install java-1.8.0-devel
執(zhí)行如下命令,添加具有Maven程序包的存儲庫。
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
執(zhí)行如下命令,設置存儲庫的版本號(以4.0.0為例)。
sudo sed -i s/4.0.0/6/g /etc/yum.repos.d/epel-apache-maven.repo
執(zhí)行如下命令,安裝Maven工具。
sudo yum install -y apache-maven
說明如果回顯信息中報類似XXX的錯誤,您可以執(zhí)行以下任意一種命令安裝Maven。
sudo yum install -y apache-maven --skip-broken
sudo yum install -y apache-maven --nobest
創(chuàng)建用于連接圖數(shù)據(jù)庫GDB實例的配置文件(以pom.xml為例)。
執(zhí)行如下命令,創(chuàng)建并進入配置文件所在目錄。
mkdir gdb-gremlin-test cd gdb-gremlin-test
執(zhí)行如下命令,創(chuàng)建pom.xml文件。
touch pom.xml
執(zhí)行如下命令,編輯pom.xml文件。
vi pom.xml
輸入
i
,將以下內容復制至pom.xml文件中。<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gdb.alibaba</groupId> <artifactId>GdbGremlinExample</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>GdbGremlinExample</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.4.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.3</version> <configuration> <mainClass>com.gdb.alibaba.Test</mainClass> <complianceLevel>1.8</complianceLevel> </configuration> </plugin> </plugins> </build> </project>
按Esc鍵,輸入
:wq
退出vi編輯器。
創(chuàng)建用于連接Java客戶端的配置文件(以Test.java為例)。
執(zhí)行如下命令,創(chuàng)建并進入配置文件所在目錄。
mkdir -p src/main/java/com/gdb/alibaba/ cd src/main/java/com/gdb/alibaba
執(zhí)行如下命令,創(chuàng)建Test.java文件。
touch Test.java
執(zhí)行如下命令,編輯Test.java文件。
vi Test.java
輸入
i
,將以下內容根據(jù)業(yè)務需求在本地修改完成后復制粘貼至Test.java文件中。package com.gdb.alibaba; import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.Client; import org.apache.tinkerpop.gremlin.driver.Result; import org.apache.tinkerpop.gremlin.driver.ResultSet; import org.apache.tinkerpop.gremlin.driver.RequestOptions; import java.util.List; import java.util.Map; import java.util.HashMap; import java.io.File; public class Test { public static void main( String[] args ) { try { if(args.length != 1) { System.out.println("gdb-remote.yaml path needed"); return; } String yaml = args[0]; // 1. 初始化客戶端。 Cluster cluster = Cluster.build(new File(yaml)).create(); Client client = cluster.connect().init(); // 2. 配置超時時間為5000毫秒。 RequestOptions.Builder options = RequestOptions.build().timeout(5000); options.addParameter("G___id", "sand131_id_5_99"); String dsl = "g.V(G___id)"; // 3. 發(fā)送Gremlin請求到圖數(shù)據(jù)庫GDB服務端。 ResultSet results = client.submit(dsl, options.create()); List<Result> result = results.all().join(); result.forEach(p -> System.out.println(p.getObject())); // 4. 關閉客戶端。 cluster.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } }
按Esc鍵,輸入
:wq
退出vi編輯器。
創(chuàng)建用于連接Java客戶端和圖數(shù)據(jù)庫GDB實例的配置文件(以gdb-remote.yaml為例)。
執(zhí)行如下命令,創(chuàng)建gdb-remote.yaml文件。
touch gdb-remote.yaml
執(zhí)行如下命令,編輯gdb-remote.yaml文件。
vi gdb-remote.yaml
輸入
i
,將以下內容按照業(yè)務需求在本地修改完成后復制粘貼至gdb-remote.yaml文件中。hosts: <your_gdb_endpoint> //<your_gdb_endpoint>為圖數(shù)據(jù)庫GDB實例的連接地址。 port: <port> //<port>為圖數(shù)據(jù)庫GDB實例的端口號。 username: <username> //<username>為圖數(shù)據(jù)庫GDB實例的賬號。 password: <password> //<password>為圖數(shù)據(jù)庫GDB實例的賬號密碼。 serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: false } }
按Esc鍵,輸入
:wq
退出vi編輯器。
編譯并執(zhí)行Java程序。
執(zhí)行如下命令,進入pom.xml文件所在目錄(即用于連接圖數(shù)據(jù)庫GDB實例的配置文件所在目錄)。
cd /home/gdb-gremlin-test
執(zhí)行如下命令,編譯并執(zhí)行Java程序。
mvn compile exec:java -Dexec.args="/home/apache-tinkerpop-gmlin-console-3.4.0/conf/gdb-remote.yaml"
Python
執(zhí)行如下命令,初始化客戶端。
client = client.Client('ws://${your-gdb-endpoint}:8182/gremlin', 'g', username="${username}", password="${password}")
執(zhí)行如下命令,配置超時時間為5000毫秒。
dsl = "g.V(G___id)" parameters = {} parameters["G___id"] = "sand131_id_5_99" message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})
執(zhí)行如下命令,發(fā)送請求至圖數(shù)據(jù)庫GDB服務端。
results = client.submit(message).all().result()
執(zhí)行如下命令,關閉客戶端。
client.close()
.Net
執(zhí)行如下命令,初始化客戶端。
var gremlinServer = new GremlinServer(endpoint, port, username: username, password: password); var gremlinClient = new GremlinClient(gremlinServer);
執(zhí)行如下命令,配置超時時間為5000毫秒。
string dsl = "g.V(G___id)"; Dictionary<string, object> bindings = new Dictionary<string, object> {{"G___id", "sand131_id_5_99"}}; var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, dsl) .AddArgument(Tokens.ArgsBindings, bindings).AddArgument("scriptEvaluationTimeout", 5000);
執(zhí)行如下命令,發(fā)送請求至圖數(shù)據(jù)庫GDB服務端。
await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);
關閉客戶端。
Go
執(zhí)行如下命令,初始化客戶端。
settings := &goClient.Settings{ Host: host, Port: port, Username: username, Password: password, } client := goClient.NewClient(settings)
執(zhí)行如下命令,配置超時時間為5000毫秒。
parameters := make(map[string]interface{}) parameters["G___id"] = "sand131_id_5_99" options := graph.NewRequestOptionsWithBindings(bindings) options.SetTimeout(5000)
執(zhí)行如下命令,發(fā)送請求至圖數(shù)據(jù)庫GDB服務端。
dsl := "g.V(G___id)" results, err := client.SubmitScriptOptions(dsl, options)
執(zhí)行如下命令,關閉客戶端。
client.Close()
其他方法配置超時時間
Java bytecode
執(zhí)行如下命令,初始化客戶端。
Cluster cluster = Cluster.build(new File(yaml)).create(); Client client = cluster.connect().init();
執(zhí)行如下命令,配置超時時間為5000毫秒。
g.with('scriptEvaluationTimeout', 5000).V().limit(1).toList();
執(zhí)行如下命令,發(fā)送請求至圖數(shù)據(jù)庫GDB服務端。
List<Vertex> list = g.V().has("person","name","marko").out("knows").toList();
執(zhí)行如下命令,關閉客戶端。
cluster.close();
Java 請求超時時間配置
// 1. 初始化客戶端 client
// 2. 配置請求參數(shù),包括超時時間,bindings參數(shù)化
RequestOptions.Builder options = RequestOptions.build().timeout(5000);
options.addParameter("G___id", "sand131_id_5_99");
String dsl = "g.V(G___id)";
// 3. 發(fā)送請求到GDB服務端,同時提供請求的配置
ResultSet results = client.submit(dsl, options.create());
// 4. 結束任務后關閉客戶端 client
將sand131_id_5_99替換為實際請求參數(shù)。
Gremlin-console 請求超時時間配置
:remote config timeout 5000
Python 請求超時時間配置
from gremlin_python.driver.request import RequestMessage
# 1. 初始化客戶端 client
dsl = "g.V(G___id)";
parameters = {}
parameters["G___id"] = "sand131_id_5_99"
# 2. 配置請求,包括超時時間,bindings參數(shù)化,請求語句
message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})
# 3. 發(fā)送請求到GDB服務端,同時包含有請求的配置
results = client.submit(message).all().result()
# 4. 結束任務后關閉客戶端 client
將sand131_id_5_99替換為實際請求參數(shù)。
.Net 請求超時時間配置
// 1. 初始化客戶端 client
string dsl = "g.V(G___id)";
Dictionary<string, object> bindings = new Dictionary<string, object> {{"G___id", "sand131_id_5_99"}};
// 2. 配置請求,包括超時時間,bindings參數(shù)化,請求語句
var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, dsl)
.AddArgument(Tokens.ArgsBindings, bindings).AddArgument("scriptEvaluationTimeout", 5000);
// 3. 發(fā)送請求到GDB服務端,同時包含有請求的配置
await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);
// 4. 結束任務后關閉客戶端 client
將sand131_id_5_99替換為實際請求參數(shù)。
Go 請求超時時間配置
import "github.com/aliyun/alibabacloud-gdb-go-sdk/gdbclient/graph"
// 1. 初始化客戶端 client
parameters := make(map[string]interface{})
parameters["G___id"] = "sand131_id_5_99"
// 2. 配置請求參數(shù),包括超時時間,bindings參數(shù)化
options := graph.NewRequestOptionsWithBindings(bindings)
options.SetTimeout(5000)
// 3. 發(fā)送請求到GDB服務端,同時提供請求的配置
dsl := "g.V(G___id)"
results, err := client.SubmitScriptOptions(dsl, options)
// 4. 結束任務后關閉客戶端 client
將sand131_id_5_99替換為實際請求參數(shù)。
bytecode請求超時時間配置
圖數(shù)據(jù)庫支持bytecode請求的超時時間配置,Java 環(huán)境使用如下(其他環(huán)境暫不支持)。
g.with('scriptEvaluationTimeout', 2000).V().limit(1).toList()