如何解决为什么 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 个值,按预期工作并在几毫秒内返回。
虽然这无关紧要(因为我应该得到正确的错误而不是什么都没有),但我已经增加了服务器端 maxHeaderSize
、maxChunkSize
、maxContentLength
等。到高得离谱的数字。更改序列化格式(例如从 GraphSONMessageSerializerV3d0
到 GraphBinaryMessageSerializerV1
)也无济于事。
注意:我知道非常长的遍历是 an anti-pattern in Gremlin,但有时构建遍历是不可能的或非常低效的,以便它们可以使用注入的值。
解决方法
我在 gremlin-users 上回答了这个问题,没想到 StackOverflow 上也有人问过这个问题。为完整起见,我将在此处重复我的回复。
问题与字节和字符串长度的关系不大,而与遍历链的长度(即遍历的步数)有关。您最终会在服务器上的堆栈大小上达到 JVM 限制。您可以通过更改 -Xss
值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置,例如 -Xmx
和垃圾收集选项。
我确实觉得有趣的是,您没有收到任何错误消息 - 您应该在某处看到一个 stackoverflow,除非服务器完全被您的请求所困扰。我会考虑向它抛出更多 -Xmx
以查看您是否可以让它至少以错误响应,或者密切关注服务器日志以至少看到它出现在那里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。