Neptune Engine升级至1.1.1与Gremlin 3.5.3后出现WebSocket连接错误求助
问题分析与解决方案
你遇到的WebSocket is not open: readyState 2 (CLOSING)错误,核心原因是连接被服务器主动关闭后仍被复用,结合Neptune 1.1.1和Gremlin 3.5.3的版本特性,主要和连接保活机制、连接复用逻辑有关,具体调整方案如下:
1. 启用WebSocket Ping保活机制
当前代码中pingEnabled:false会关闭驱动的心跳检测,而Neptune 1.1.1默认会清理空闲超过一定时间的连接。当连接被服务器标记为关闭状态后,代码仍尝试复用该连接,就会触发这个错误。
修改连接配置,启用ping并合理设置参数:
const dc = new DriverRemoteConnection( `wss://${process.env.NEPTUNE_HOST}:${process.env.NEPTUNE_PORT}/gremlin`, { pingEnabled: true, pingInterval: 30000, // 30秒发送一次心跳 pingTimeout: 10000 // 心跳超时时间 } );
2. 修复连接复用的逻辑漏洞
当前代码通过全局变量dc复用连接,但没有检查连接的当前状态。如果连接已经被服务器关闭(readyState为CLOSING或CLOSED),直接复用会报错。需要在使用前增加状态检查,失效时重新建立连接:
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection; const Graph = gremlin.structure.Graph; function getConnection() { // 检查连接是否存在且处于开放状态 if (typeof dc === 'undefined' || dc._connection.readyState !== 1) { // 关闭旧连接(如果存在) if (dc) { dc.close(); } // 重新创建连接 dc = new DriverRemoteConnection( `wss://${process.env.NEPTUNE_HOST}:${process.env.NEPTUNE_PORT}/gremlin`, { pingEnabled: true, pingInterval: 30000, pingTimeout: 10000 } ); } return dc; }
3. 额外配置建议
- 监听连接的错误和关闭事件,及时处理连接失效:
dc.on('error', (err) => { console.error('Connection error:', err); dc = undefined; }); dc.on('close', () => { console.log('Connection closed'); dc = undefined; }); - 确认Neptune集群的空闲连接超时配置,确保ping间隔小于超时时间,避免连接被主动清理。
内容的提问来源于stack exchange,提问作者Chinnu Raju
相关产品推荐
相关产品推荐

