【发布时间】: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