You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS SDK2创建Neptune顶点时遇连接超时问题求解决方案

AWS Neptune连接超时(io.netty.channel.ConnectTimeoutException)解决方案

问题描述

我正尝试使用AWS SDK2 API为特定顶点创建数据,以下是构建Gremlin遍历的代码及顶点创建的代码,但在调用vertex.iterate()接口时,出现了io.netty.channel.ConnectTimeoutException连接超时异常,具体信息如下:

构建Gremlin遍历的代码

GraphTraversalSource withRemote = null;

Cluster.Builder builder = Cluster.build();
builder.addContactPoint("aws-host-engine");
builder.port(8182);
builder.enableSsl(true);
builder.connectionSetupTimeoutMillis(200000);
builder.maxInProcessPerConnection(20);
builder.maxConnectionPoolSize(20);
builder.keepAliveInterval(0);

if (Objects.nonNull(accessKeyId)) {
    // if IAM Authentication is enabled while cluster setup
    logDebug("IAM Authentication is enabled");
    builder.handshakeInterceptor(r -> {
        try {
            AwsBasicCredentials basicAWSCredentials = AwsBasicCredentials.create("accessKeyId",
                    "secretAccessKey");
            StaticCredentialsProvider awsStaticCredentialsProvider = StaticCredentialsProvider
                    .create(basicAWSCredentials);
            NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer(region,
                    awsStaticCredentialsProvider);
            sigV4Signer.signRequest(r);
        } catch (NeptuneSigV4SignerException e) {
            throw new RuntimeException("Exception occurred while signing the request", e);
        }
        return r;
    });
}
cluster = builder.create();
withRemote = AnonymousTraversalSource.traversal().withRemote(DriverRemoteConnection.using(cluster));

顶点创建代码

Transaction tx = beginTx(traversal);

for (int i = 0; i < insertCount; i++) {
    Map<Object, Object> attrNameToValues = getPropertyTypeWiseValues(tableName, i);
    
    GraphTraversal<Vertex, Vertex> vertex = traversal.addV(vertexName);
    for (Entry<?, ?> entry : attrNameToValues.entrySet()) {
        vertex.property(Cardinality.single, entry.getKey(), entry.getValue());
    }
    vertex.iterate();
}

tx.commit();
tx.close(); 

异常信息

ERROR org.apache.tinkerpop.gremlin.driver.Client - Could not initialize client for Host{address=aws-host-engine/ip:8182, hostUri=wss://aws-host-engine:8182/gremlin}
06:21:46  2026-04-22 06:21:41,142   696378 [main] [] []      ERROR org.apache.tinkerpop.gremlin.driver.Client - Initialization failed
06:21:46  java.util.concurrent.CompletionException: Could not initialize 2 (minPoolSize) connections in pool. Successful connections=0. Closing the connection pool.
06:21:46    at org.apache.tinkerpop.gremlin.driver.ConnectionPool.<init>(ConnectionPool.java:164)
06:21:46    at org.apache.tinkerpop.gremlin.driver.ConnectionPool.<init>(ConnectionPool.java:103)
06:21:46    at org.apache.tinkerpop.gremlin.driver.ConnectionPool.<init>(ConnectionPool.java:98)
06:21:46    at org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient.lambda$new$5(Client.java:584)
06:21:46    at org.apache.tinkerpop.gremlin.driver.Client$ClusteredClient.lambda$initializeImplementation$0(Client.java:534)
06:21:46    at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
06:21:46    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
06:21:46    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
06:21:46    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
06:21:46    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
06:21:46    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
06:21:46    at java.base/java.lang.Thread.run(Thread.java:829)
06:21:46  Caused by: org.apache.tinkerpop.gremlin.driver.exception.ConnectionException: Could not open Connection{channel=null host=Host{address=aws-host-engine/ip:8182, hostUri=wss://aws-host-engine:8182/gremlin} isDead=false borrowed=0 pending=0 markedReplaced=false closing=false created=2026-04-22T00:51:11.105874Z thread=gremlin-driver-conn-scheduler-1}
06:21:46    at org.apache.tinkerpop.gremlin.driver.Connection.<init>(Connection.java:142)
06:21:46    at org.apache.tinkerpop.gremlin.driver.ConnectionFactory.create(ConnectionFactory.java:34)
06:21:46    at org.apache.tinkerpop.gremlin.driver.ConnectionPool.lambda$new$0(ConnectionPool.java:130)
06:21:46    ... 7 more
06:21:46  Caused by: io.netty.channel.ConnectTimeoutException: connection timed out after 30000 ms: aws-host-engine/ip:8182
06:21:46    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:263)
06:21:46    at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)
06:21:46    at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:160)
06:21:46    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
06:21:46    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
06:21:46    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
06:21:46    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
06:21:46    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
06:21:46    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
06:21:46    ... 1 more
06:21:46    Suppressed: java.lang.RuntimeException: Rethrowing promise failure cause
06:21:46        at io.netty.util.concurrent.DefaultPromise.rethrowIfFailed(DefaultPromise.java:686)
06:21:46        at io.netty.util.concurrent.DefaultPromise.sync(DefaultPromise.java:420)
06:21:46        at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:119)
06:21:46        at io.netty.channel.DefaultChannelPromise.sync(DefaultChannelPromise.java:30)
06:21:46        at org.apache.tinkerpop.gremlin.driver.Connection.<init>(Connection.java:118)
06:21:46        at org.apache.tinkerpop.gremlin.driver.ConnectionFactory.create(ConnectionFactory.java:34)
06:21:46        at org.apache.tinkerpop.gremlin.driver.ConnectionPool.lambda$new$0(ConnectionPool.java:130)

解决方案

1. 排查网络连通性

  • 用telnet aws-host-engine 8182或nc -zv aws-host-engine 8182测试客户端到Neptune端点的连通性
  • 若Neptune在VPC内,确保客户端处于同一VPC,或通过VPN、专线、VPC peering连接;检查安全组入站规则,允许客户端IP/子网访问8182端口(HTTPS)

2. 调整Netty连接超时参数

代码中connectionSetupTimeoutMillis设置了200秒,但Netty默认连接超时是30秒,需单独配置:

builder.channelizer(NettyChannelizer.class)
       .configureChannel(c -> 
           c.config().setConnectTimeoutMillis(200000) // 与connectionSetupTimeoutMillis保持一致
       );

3. 修正IAM认证配置

  • 替换硬编码的凭证为实际环境变量或配置值:
AwsBasicCredentials basicAWSCredentials = AwsBasicCredentials.create(
    System.getenv("AWS_ACCESS_KEY_ID"),
    System.getenv("AWS_SECRET_ACCESS_KEY")
);
  • 确认IAM角色/用户拥有neptune-db:connect权限,且region参数匹配Neptune集群所在区域

4. 优化连接池配置

  • 降低初始化连接数,避免同时创建过多连接:
builder.minConnectionPoolSize(1);
  • 检查maxConnectionPoolSize和maxInProcessPerConnection是否超过Neptune默认1000的连接上限,按需调整

5. 验证SSL配置

  • 确认Neptune集群SSL启用状态与客户端enableSsl(true)配置一致
  • 若使用自定义CA证书,添加到客户端信任库:
builder.sslContext(SslContextBuilder.forClient()
    .trustManager(Paths.get("/path/to/ca-cert.pem").toFile())
    .build());

6. 批量写入优化

当前循环单条写入效率低,建议批量构建遍历:

Transaction tx = beginTx(traversal);
GraphTraversal<?, ?> batchTraversal = traversal;

for (int i = 0; i < insertCount; i++) {
    Map<Object, Object> attrNameToValues = getPropertyTypeWiseValues(tableName, i);
    GraphTraversal<Vertex, Vertex> vertex = traversal.addV(vertexName);
    for (Entry<?, ?> entry : attrNameToValues.entrySet()) {
        vertex.property(Cardinality.single, entry.getKey(), entry.getValue());
    }
    batchTraversal = batchTraversal.add(vertex);
}

batchTraversal.iterate();
tx.commit();
tx.close();

内容的提问来源于stack exchange,提问作者Arpit Dongaonkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 17:34:53