spring-data-neo4j
RESTAPIを介してスタンドアロンのNeo4Jサーバーにアクセスするために使用しています。@MapResult
取得したオブジェクトのリストを変換するためにを使用してSpringリポジトリを介してオブジェクトを取得しているときに、重大なパフォーマンスの問題が発生します。
まず、サーバーログ(http.log)で、取得したインターフェイスでgetter / setterの反復または呼び出しを開始すると@MapResult
、多数のRESTリクエストがバックグラウンドで発生することを確認しました。@MapResult
あるケースでは、Neo4Jサーバーが同じマシンで実行されているときに、6秒以上かかる5つのオブジェクトのリストを繰り返してアクセスしているときに、1900以上のRESTリクエストが発生しました。
私は問題を以下のように見える単一の単純な関係をフェッチすることに減らしました。MyMapResultInterface.getRoute()を呼び出すと、Neo4Jサーバーログで、この単一のオブジェクトをフェッチするために9つのhttpリクエストが発生することがわかります。これらの多数のhttpリクエストは予想される/設計によるものですか?それとも私は何かが足りないのですか?@MapResult
使用法とその影響に関するドキュメントはほとんど見つかりませんでした。
関係モデル:
@RelationshipEntity(type="ROUTE")
@TypeAlias("Route")
public class Route {
@GraphId
private Long id;
@StartNode
private Location startAt;
@EndNode
private Location endAt;
private String routeName;
private String city;
private long distance;
private Date createdOn;
}
MyMapResultInterface.getRoute()を呼び出すとhttp.logに表示されるログ:
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/node/13/properties HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/relationship/28 HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
GET /db/data/node/25/properties HTTP/1.1" 200 0 "-" "neo4j-rest-graphdb/1.8.RC2
多くの重複するGETが上に表示されています。単なる解釈では、 GETの数はオブジェクトRoute/db/data/relationship/28
のフィールドの総数に等しいように見え、おそらくとフィールドに対して2つのGET要求があります。/db/data/node/{nodeId}/properties
@StartNode
@EndNode
編集:
私の観察に加えて、これは問題であるだけでなく@MapResult
、リポジトリメソッドからの単純にマップされた結果の問題でもあることに気づきました(以下の例)
Iterable<Route> routes = routeRepository.getAvailableRoutesForUser(user.getId());
これでも、neo4jサーバーに対して多数のhttpRESTリクエストが発生します。
アップデート:
回答でMichaelHungerが示唆しているように、これらはNeo4jRESTAPIでパフォーマンスを向上させることができる2つのアプローチです。ただし、これにより、非常に大規模で複雑な暗号クエリが発生し、コードを管理できなくなり、保守が困難になります。
したがって、最終的にすべてのアプローチを評価した後、Neo4j RESTインターフェースを廃止することを決定し、Neo4j組み込みを使用し始めました。そして、埋め込まれたNeo4jは、Herokuでは使用できません。Herokuを廃止する必要がありました。アプリケーションをAmazonAWSに移行しました。
Neo4jが、実稼働環境で許容できるパフォーマンスを備えたリモートアクセスチャネルをできるだけ早く考案することを願っています。