Gremlin запрос через HTTP очень медленный - PullRequest
0 голосов
/ 05 сентября 2018

Итак, я выполняю два очень простых запроса gremlin как через консоль Gremlin, так и через HTTP-запрос (отправленный с того же компьютера, на котором находится сервер 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-ответ не может быть проблемой сериализации - ему нужно только вернуть число, как в первом запросе.

У кого-нибудь есть хорошие идеи?

UPDATE:

Запуск profile() дает некоторые интересные результаты (скриншоты прилагаются ниже). Похоже, что все работает намного медленнее при вызове через HTTP, что для меня не имеет смысла ...

с консоли:

Через HTTP-запрос:

1 Ответ

0 голосов
/ 24 сентября 2018

С помощью @stephen mallette мне удалось найти ответ на этот вопрос. Оказывается, консоль, которая работает в сеансе, кэширует ответы на запросы, поэтому, когда я запрашивал одни и те же идентификаторы несколько раз, консоль просто получала ответ из кеша и фактически вообще не запрашивала динамо. HTTP, с другой стороны, работает без сессий, поэтому каждый запрос по HTTP ударял по «Динамо». Само собой разумеется - получение результата из кэша намного, намного быстрее, чем необходимость запрашивать динамо.

Чтобы заставить запрос попадать в «Динамо» в консоли, я добавил g.tx().rollback() после каждого выполнения запроса, и теперь запрос выполняется в сопоставимое время, независимо от того, использую ли я консоль или запрос по HTTP. К сожалению, это довольно медленно, на мой взгляд, но это, вероятно, тема для другого вопроса:)

ОБНОВЛЕНИЕ: Причиной медленного времени отклика с «Динамо» было ограничение скорости чтения / записи, которое было добавлено, чтобы снизить стоимость «Динамо». При значительном увеличении ограничений скорости запрос выполнялся намного быстрее. Это, к сожалению, слишком дорого для меня, поэтому я перешел на работу с Cassandra в качестве бэкенда, что также дает мне отличное время отклика:)

...