0

spring-data-neo4jRESTAPIを介してスタンドアロンの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が、実稼働環境で許容できるパフォーマンスを備えたリモートアクセスチャネルをできるだけ早く考案することを願っています。

4

1 に答える 1

2

良い点は、一般的に、SDNのオブジェクト表現はNeo4jサーバーのRESTインタラクション用にまだ最適化されていません。これは、Neo4jのバイナリプロトコルとサイファーを使用する次のメジャーバージョンで変更されます。

サイファーから興味のある情報を返すだけでテストしていただけませんか

  1. Result<Map<String,Object>>それをメソッドの戻り型として直接読み取り、
  2. MapResultこれらのプリミティブ型のみを公開するから。
于 2013-03-25T09:36:05.687 に答える