如何在 Javascript/AWS Lambda 中正确使用/关闭 Gremlin 事务

问题描述 投票:0回答:1

我在 javascript 中遇到了 gremlin 事务的一些行为,并且我的 websocket 连接被卡在打开状态。我读过

https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-transactions.html https://docs.aws.amazon.com/neptune/latest/userguide/best-practices-gremlin-java-close-connections.html https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions.html

但我不能 100% 确定正在发生的事情或我应该对交易及其行为做什么。根据文档,似乎在 lambda 环境中,我不调用

await dc.close()

在本地,我只是运行

node testNeptune
。此代码在本地使所有写入都失败

const makeHangingTransaction = async function () {
    let dc = new DriverRemoteConnection(
        '<myurl>',
        { pingInterval: 5000, pingTimeout: 5000 }
    );
    let graph = new Graph();
    let g = graph.traversal().withRemote(dc);
    await dropAll(g);
    let tx = g.tx();
    let gtx = tx.begin();
    try {
        console.log('transaction test1');
        console.log(await gtx.addV('person').next());
        console.log(await gtx.V().toList());
        console.log();
        await tx.commit();
    } finally {
        tx.close();
    }
    try {
        console.log('transaction test1');
        console.log(await gtx.addV('person').next());
        console.log(await gtx.V().toList());
        console.log();
        await tx.commit();
    } finally {
        tx.close();
    }
};
makeHangingTransaction();

脚本运行,然后以

Error: Connection has been closed.
结束;我的猜测是 tx.close() 关闭,然后“父”dc 连接本身就会终止并抛出此错误,而不会终止实际的 websocket 连接。我知道 tx.close() 应该等待。

这会创建一个“挂起”事务,我无法再从任何地方执行任何写入命令;我的 aws jupyter 和 local 都会挂起,然后失败并显示

Failed to complete Insert operation for a VertexProperty due to conflicting concurrent operations. Please retry. 0 transactions are currently rolling back 
。在 websocket(?) 超时之前我必须等待几分钟才能再次写入。

问题:

  1. 如果我的代码混乱并且 websocket 连接处于“打开”状态,有没有办法强制重置它或创建新连接?
  2. 据我所知,为什么我的 jupyter 写入会失败,它应该使用与我的 neptune 服务器的不同连接
  3. 我应该总是在本地手动调用await dc.close()吗?
  4. 我会使用await tx.close()吗?这实际上对我没有任何帮助;我的剧本一直在等待。退出后我必须打电话
    await dc.close()

谢谢

amazon-web-services gremlin amazon-neptune
1个回答
0
投票

希望以下注释可以帮助您解决当前的问题:

对于 #1 - 您可以通过 Gremlin Status API 和查询取消 API 取消正在进行的查询/交易:https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-api-status-取消.html

对于#2 - 这最终取决于数据库中锁定的内容以及是否遇到死锁情况。这包括根据 Neptune 的索引结构采取的间隙锁。以下是更广泛的解释:https://docs.aws.amazon.com/neptune/latest/userguide/transactions-neptune.html#transactions-neptune-false-conflicts

对于 #3 和 #4 - 您不需要“关闭”交易。提交就足够了,如果提交失败,事务会自动回滚。如此处所述:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-transactions.html#access-graph-gremlin-transactions-session-bound您可以强制回滚如果您到达事务仍处于打开状态的代码部分,并且您希望在此时提交事务。

如果您使用 AWS Lambda,通常的良好做法是在 Lambda 处理程序外部建立连接,并假设该连接始终对任何后续 Lambda 函数调用打开。这减少了每次调用时打开/关闭连接的开销。可以在这里找到与 Neptune 一起使用的结构良好的 Javascript Lambda 函数的良好起点:https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions-examples.html#lambda-functions -示例-javascript。这包括使用 Neptune 的基于 Lambda 的应用程序通常需要的异常处理、重试和重新连接逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.