配置Gremlin请求超时时间

图数据库GDB支持修改客户端向图数据库GDB发送请求数据时的超时时间,您可以根据业务场景和数据量等修改超时时间。本文介绍不同语言环境中配置Gremlin请求超时时间的方法。

超时时间简介

  • 客户端向图数据库GDB发送请求数据时,如果请求时间超过图数据库GDB设置的超时时间(默认为1800毫秒),则会发生超时现象,造成结果无法返回的现象。

  • 超时时间的值为Long类型,单位为毫秒。

  • 建议您不要配置过大的超时时间。

  • 当客户端和图数据库GDB的连接在请求超时前断开时,会导致新的请求不生效。

使用各种语言配置超时时间

以下介绍各语言接入使用scripts请求的超时时间配置,示例配置超时时间为5000毫秒。

Java

  1. 在客户端安装Java和Maven工具。

    1. 执行如下命令,安装Java(以1.8.0版本为例)。

      sudo yum install java-1.8.0-devel
    2. 执行如下命令,添加具有Maven程序包的存储库。

      wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
    3. 执行如下命令,设置存储库的版本号(以4.0.0为例)。

      sudo sed -i s/4.0.0/6/g /etc/yum.repos.d/epel-apache-maven.repo
    4. 执行如下命令,安装Maven工具。

      sudo yum install -y apache-maven
      说明

      如果回显信息中报类似XXX的错误,您可以执行以下任意一种命令安装Maven。

      • sudo yum install -y apache-maven --skip-broken
      • sudo yum install -y apache-maven --nobest
  2. 创建用于连接图数据库GDB实例的配置文件(以pom.xml为例)。

    1. 执行如下命令,创建并进入配置文件所在目录。

      mkdir gdb-gremlin-test
      cd gdb-gremlin-test
    2. 执行如下命令,创建pom.xml文件。

      touch pom.xml
    3. 执行如下命令,编辑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编辑器。

  3. 创建用于连接Java客户端的配置文件(以Test.java为例)。

    1. 执行如下命令,创建并进入配置文件所在目录。

      mkdir -p src/main/java/com/gdb/alibaba/
      cd src/main/java/com/gdb/alibaba
    2. 执行如下命令,创建Test.java文件。

      touch Test.java
    3. 执行如下命令,编辑Test.java文件。

      vi Test.java

      输入i,将以下内容根据业务需求在本地修改完成后复制粘贴至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. 发送Gremlin请求到图数据库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编辑器。

  4. 创建用于连接Java客户端和图数据库GDB实例的配置文件(以gdb-remote.yaml为例)。

    1. 执行如下命令,创建gdb-remote.yaml文件。

      touch gdb-remote.yaml
    2. 执行如下命令,编辑gdb-remote.yaml文件。

      vi gdb-remote.yaml

      输入i,将以下内容按照业务需求在本地修改完成后复制粘贴至gdb-remote.yaml文件中。

      hosts: <your_gdb_endpoint> //<your_gdb_endpoint>为图数据库GDB实例的连接地址。
      port: <port> //<port>为图数据库GDB实例的端口号。
      username: <username> //<username>为图数据库GDB实例的账号。
      password: <password> //<password>为图数据库GDB实例的账号密码。
      serializer: {
        className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
        config: { serializeResultToString: false }
      }

      按Esc键,输入:wq退出vi编辑器。

  5. 编译并执行Java程序。

    1. 执行如下命令,进入pom.xml文件所在目录(即用于连接图数据库GDB实例的配置文件所在目录)。

      cd /home/gdb-gremlin-test
    2. 执行如下命令,编译并执行Java程序。

      mvn compile exec:java  -Dexec.args="/home/apache-tinkerpop-gmlin-console-3.4.0/conf/gdb-remote.yaml"

Python

  1. 执行如下命令,初始化客户端。

    client = client.Client('ws://${your-gdb-endpoint}:8182/gremlin', 'g', username="${username}", password="${password}")
  2. 执行如下命令,配置超时时间为5000毫秒。

    dsl = "g.V(G___id)"
    parameters = {}
    parameters["G___id"] = "sand131_id_5_99"
    message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})
  3. 执行如下命令,发送请求至图数据库GDB服务端。

    results = client.submit(message).all().result()
  4. 执行如下命令,关闭客户端。

    client.close()

.Net

  1. 执行如下命令,初始化客户端。

    var gremlinServer = new GremlinServer(endpoint, port, username: username, password: password); 
    var gremlinClient = new GremlinClient(gremlinServer);
  2. 执行如下命令,配置超时时间为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);
  3. 执行如下命令,发送请求至图数据库GDB服务端。

    await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);
  4. 关闭客户端。

Go

  1. 执行如下命令,初始化客户端。

    settings := &goClient.Settings{
            Host:     host,
            Port:     port,
            Username: username,
            Password: password,
        }
    client := goClient.NewClient(settings)
  2. 执行如下命令,配置超时时间为5000毫秒。

    parameters := make(map[string]interface{})
    parameters["G___id"] = "sand131_id_5_99"
    options := graph.NewRequestOptionsWithBindings(bindings)
    options.SetTimeout(5000)
  3. 执行如下命令,发送请求至图数据库GDB服务端。

    dsl := "g.V(G___id)"
    results, err := client.SubmitScriptOptions(dsl, options)
  4. 执行如下命令,关闭客户端。

    client.Close()

其他方法配置超时时间

Java bytecode

  1. 执行如下命令,初始化客户端。

    Cluster cluster = Cluster.build(new File(yaml)).create();
    Client client = cluster.connect().init();
  2. 执行如下命令,配置超时时间为5000毫秒。

    g.with('scriptEvaluationTimeout', 5000).V().limit(1).toList();
  3. 执行如下命令,发送请求至图数据库GDB服务端。

    List<Vertex> list = g.V().has("person","name","marko").out("knows").toList();
  4. 执行如下命令,关闭客户端。

    cluster.close();

Java 请求超时时间配置

// 1. 初始化客户端 client

// 2. 配置请求参数,包括超时时间,bindings参数化
RequestOptions.Builder options = RequestOptions.build().timeout(5000);
options.addParameter("G___id", "sand131_id_5_99");

String dsl = "g.V(G___id)";
// 3. 发送请求到GDB服务端,同时提供请求的配置
ResultSet results = client.submit(dsl, options.create());

// 4. 结束任务后关闭客户端 client
说明

将sand131_id_5_99替换为实际请求参数。

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参数化,请求语句
message = RequestMessage('', 'eval', {'gremlin': dsl, 'scriptEvaluationTimeout': 5000, 'bindings': parameters})

# 3. 发送请求到GDB服务端,同时包含有请求的配置
results = client.submit(message).all().result()

# 4. 结束任务后关闭客户端 client
说明

将sand131_id_5_99替换为实际请求参数。

.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参数化,请求语句
var msgBuilder = RequestMessage.Build(Tokens.OpsEval).AddArgument(Tokens.ArgsGremlin, dsl)
        .AddArgument(Tokens.ArgsBindings, bindings).AddArgument("scriptEvaluationTimeout", 5000);

// 3. 发送请求到GDB服务端,同时包含有请求的配置
await gremlinClient.SubmitAsync<T>(msgBuilder.Create()).ConfigureAwait(false);

// 4. 结束任务后关闭客户端 client
说明

将sand131_id_5_99替换为实际请求参数。

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. 配置请求参数,包括超时时间,bindings参数化
options := graph.NewRequestOptionsWithBindings(bindings)
options.SetTimeout(5000)

// 3. 发送请求到GDB服务端,同时提供请求的配置
dsl := "g.V(G___id)"
results, err := client.SubmitScriptOptions(dsl, options)

// 4. 结束任务后关闭客户端 client
说明

将sand131_id_5_99替换为实际请求参数。

bytecode请求超时时间配置

图数据库支持bytecode请求的超时时间配置,Java 环境使用如下(其他环境暂不支持)。

g.with('scriptEvaluationTimeout', 2000).V().limit(1).toList()