因此,我正在通过Gremlin控制台和HTTP请求(从与Gremlin Server驻留在同一台计算机上发出)运行两个非常简单的gremlin查询。查询如下:
第一个查询:
console: g.V(127104, 1069144, 590016, 200864).out().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().count()}' http://localhost:8182
第二个查询:
console: g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()
http: curl -XPOST -Hcontent-type:application/json -d '{"gremlin":"g.V(127104, 1069144, 590016, 200864).out().in().dedup().count()}' http://localhost:8182
这绝不是一个巨大的图形-第一个查询返回750,第二个查询返回9154。我的问题是,与控制台相比,通过HTTP运行的查询之间存在巨大的性能差异。对于第一个查询,控制台和HTTP请求都会立即返回并查看gremlin服务器日志,我很高兴地看到,在两种情况下查询都只需要1-2毫秒。一切都很好。
现在,对于第二个查询,图片会更改。在控制台继续立即提供答案的同时,HTTP请求现在需要4到5秒(!!)才能返回答案!对于第二个查询的两次执行,服务器日志报告的执行时间大致相同(大约50-60毫秒),这是怎么回事?我只在做count(),所以HTTP响应缓慢不会成为序列化问题-就像在第一个查询中一样,它只需要返回一个数字。
有人有什么好主意吗?
更新:
运行profile()
会得到一些有趣的结果(下面的屏幕截图)。通过HTTP调用时,似乎一切运行都变慢了,这对我来说没有任何意义...
答案 0 :(得分:2)
在@stephen槌的帮助下,我设法找到了这个问题的答案。事实证明,在会话中运行的控制台缓存查询的答案,因此当我多次查询相同的ID时,控制台只是从缓存中检索了答案,而根本没有查询Dynamo。另一方面,HTTP运行无会话,因此通过HTTP进行的每个查询都导致Dynamo失败。不用说-从缓存中检索结果比必须查询Dynamo快得多。
为了强制查询在控制台中命中Dynamo,我在每次执行查询后都添加了g.tx().rollback()
,无论我使用控制台还是通过HTTP查询,查询现在都可以在相当的时间内运行。不幸的是,这在我看来相当慢,但这可能是另一个问题的话题:)
更新:Dynamo响应时间较慢的原因是由于增加了读/写速率限制以降低Dynamo的成本。当显着提高速率限制时,查询的运行速度要快得多。不幸的是,这对于我来说太昂贵了,所以我现在改用Cassandra作为后端运行,这也使我获得了出色的响应时间:)