【问题标题】:How to make AWS Lambda work reliably with Neptune over websockets?如何使 AWS Lambda 通过 websockets 与 Neptune 可靠地工作?
【发布时间】:2020-06-03 22:36:45
【问题描述】:

所以我构建了这个 API。它由一个 Lambda 函数(可通过 API Gateway 访问)组成,该函数通过 websocket 与 Neptune 图数据库实例通信。

一切都已连接并正常工作。但我最近开始注意到来自 API 的间歇性 500。经过一番调查,我发现 Neptune Gremlin 服务器会在多个请求靠近时丢弃/拒绝连接。

我发现this page 这表明无服务器的短暂性质与 websocket 不兼容,因此应在每次请求后手动关闭 websocket 连接。但在实施之后,我发现没有任何区别——仍然是 500 的。

该页面还建议,在 Neptune 上使用 Gremlin 时,您可能应该向 Neptune 发送 HTTP 请求,而不是使用 websockets,

或者,如果您使用 Gremlin,请考虑将请求提交到 Gremlin HTTP REST 端点而不是 WebSockets 端点,从而避免创建和管理连接池的生命周期的需要。

这种方法的缺点是我们必须使用基于字符串的查询(这意味着重写项目的大部分内容)。另一个缺点是 Gremlin HTTP 端点返回的数据非常非结构化。

所以我想知道的是,是否有人让 Lambda 通过 websockets 可靠地与 Neptune 通信?如果是这样,怎么做?

编辑:

由于我使用的是 AWS Chalice 框架,我认为我无法直接访问处理函数。下面是我的 lambda 的样子。

这是connect() 正在调用的代码:

import os

from gremlin_python.structure.graph import Graph
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection


def connect():
    conn_string = os.environ.get('GRAPH_DB')
    global g
    g = Graph().traversal().withRemote(DriverRemoteConnection(conn_string, 'g'))

因此,当应用启动时(启动 lambda 实例时),会调用该连接函数,并且应用会连接到 Neptune。应用程序从那里传递该全局 g 变量,以便为该调用使用相同的连接实例。在返回请求结果之前,我在 DriverRemoteConnection 对象上调用了 close()(这就是我发现我仍然得到 500 的地方)。

【问题讨论】:

    标签: amazon-web-services websocket aws-lambda gremlin-server amazon-neptune


    【解决方案1】:

    是的,可以在 Lambda 函数中使用 WebSockets 与 Neptune 通信。根据您使用的编程语言,执行此操作有不同的细微差别。最终,它会在 Lambda 函数的 handler() 中实例化客户端连接并关闭连接。

    如果使用 Java [1],您可以在处理程序之外创建集群对象,以便每次 Lambda 调用都可以重用它。但是从该集群对象配置的客户端必须在每次调用期间实例化并关闭。

    您是否有您正在使用的代码的 sn-p 可以共享以供审查?

    [1]https://docs.aws.amazon.com/neptune/latest/userguide/best-practices-gremlin-java-close-connections.html

    【讨论】:

    • 感谢您的回复。由于我使用的是 Chalice 框架,情况可能会变得复杂,因此我并不能直接访问处理程序函数。不过,我会用一些额外的信息来编辑帖子。
    • 总的来说,您需要确保每次调用 Lambda 函数时,都会建立一个新的连接,然后再关闭。从 Chalice 的角度来看,这意味着每次对 Chalice Lambda 中的路由进行 API 调用。因此,您不想在顶层执行 connect(),而是希望在每个路由中调用它,并在每个路由/API 调用结束时关闭连接。
    • 好的,太好了,我会试试这个!
    • 这个解决方案似乎有效!非常感谢泰勒!
    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2019-03-08
    • 2015-11-21
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多