首页 > 解决方案 > 为什么 Gremlin Server / JanusGraph 会忽略我的一些请求?

问题描述

我正在使用 Gremlin Python 库对 Gremlin Server 的 JanusGraph 部署执行遍历(仅使用 Tinkergraph 也会发生同样的情况)。一些长遍历(包含数千条指令)在服务器或客户端上没有得到响应、没有错误、没有超时、没有日志条目或错误。没有什么。

这种沉默处理的条件尚不清楚。所描述的行为并不线性依赖于字节或指令数。例如,这段代码对我来说将永远挂起:

g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin', 't'))
g = g.inject("")
for i in range(0, 8000):
    g = g.constant("test")
print(f"submitting traversal with length={len(g.bytecode.step_instructions)}")
result = g.next()
print(f"done, got: {result}") # this is never reached

它不仅仅取决于请求消息中的字节数,因为即使使用非常大的常数值代替“测试”,我没有得到响应的指令数也不会改变。例如,使用 Lorem Ipsum 的许多段落注入 7000 个值按预期工作,并在几毫秒内返回。

虽然这无关紧要(因为我应该得到一个适当的错误而不是什么都没有),但我已经将 server-side maxHeaderSize,maxChunkSizemaxContentLength增加到了高得离谱的数字。更改序列化格式(例如 from GraphSONMessageSerializerV3d0to GraphBinaryMessageSerializerV1)也无济于事。

注意:我知道非常长的遍历在 Gremlin 中是一种反模式,但有时不可能或非常低效地构造遍历以便它们可以使用注入的值。

标签: gremlinjanusgraphtinkerpop3gremlin-servergremlinpython

解决方案


我已经在gremlin-users上回答了这个问题,但没有意识到 StackOverflow 上也有人问过这个问题。为了完整起见,我将在此处复制我的回复。

该问题与字节和字符串长度的关系较小,而与遍历链的长度(即遍历中的步数)有关。您最终会达到服务器上堆栈大小的 JVM 限制。您可以通过更改-Xss值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置-Xmx,比如垃圾收集选项。

我确实觉得有趣的是您没有收到任何错误消息 - 您应该在某处看到 stackoverflow,除非服务器完全被您的请求所困。我会考虑投入更多-Xmx精力,看看您是否可以让它至少响应错误,或者密切关注服务器日志以至少看到它在那里出现。


推荐阅读