gremlin - 为什么 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
,maxChunkSize
等maxContentLength
增加到了高得离谱的数字。更改序列化格式(例如 from GraphSONMessageSerializerV3d0
to GraphBinaryMessageSerializerV1
)也无济于事。
注意:我知道非常长的遍历在 Gremlin 中是一种反模式,但有时不可能或非常低效地构造遍历以便它们可以使用注入的值。
解决方案
我已经在gremlin-users上回答了这个问题,但没有意识到 StackOverflow 上也有人问过这个问题。为了完整起见,我将在此处复制我的回复。
该问题与字节和字符串长度的关系较小,而与遍历链的长度(即遍历中的步数)有关。您最终会达到服务器上堆栈大小的 JVM 限制。您可以通过更改-Xss
值的大小来增加 jvm 上的堆栈大小,这应该允许您更长的遍历长度。这可能需要重新检查其他 JVM 设置-Xmx
,比如垃圾收集选项。
我确实觉得有趣的是您没有收到任何错误消息 - 您应该在某处看到 stackoverflow,除非服务器完全被您的请求所困。我会考虑投入更多-Xmx
精力,看看您是否可以让它至少响应错误,或者密切关注服务器日志以至少看到它在那里出现。
推荐阅读
- webos - 无法创建新的 WebOS TV 项目(无模板)
- spring - 错误:找不到页面 (404) 路径:/login/authenticate
- swift - 不支持用作符合协议的具体类型
- c++ - 读取文件 C++ 中的空格
- ios - iPhone Plus 设备显示奇怪的条带效果?
- android - 从 iOS 和 android 上传的图像是不同的
- iterm2 - 粘贴大量代码时,Iterm2 奇怪/重复/丢失的字符
- python-3.x - xpath:如何提取“强”标签中的文本?
- java - 使用同步块等待结果导致应用程序冻结
- arduino - 如何解析 SIM808 原始 GPS 数据?