2016-10-18 4 views
2

かなりの量のxmlデータ(1.27百万のxmlファイル、ファイルごとのプロパティを持つ1つのノード)をNeoグラフに移行する作業がありました。私たちはgoルーチンを使って噛んでいますxmlの解析、挿入のためのcypherクエリの準備などがあります。xmlを処理しなければならないため、我々はチャネルと同時にルーチンを使用してスレッド内の各ファイルを処理し、同時に実行されるワーカーの数を抑えます。goroutinesとの同時neo4j接続の処理

私は、 "tcp connection reset by peer"や "パニック:メッセージ長の予想バイトを読み込めませんでした"などのエラーが発生しているという問題があります。私はこれが私たちの労働者の中で同時に接続と声明を実行することによるものだと想像することができます。私たちの絞りは私たちを100人の並行作業者にしています。これはネオにとって大きな問題ではないと思っていますが、なぜそれが私たちを窒息させるのか分かりません。

このようなユースケースを扱うためのアーキテクチャーの推奨事項はありますか?多数のワーカールーチン(ここでは一度に100個)で単一のcypherステートメントを実行する必要がありますか?

現在、処理するファイルのキューを構築するためにファイルツリーを歩いているので、ウォークが完了した後、そのキューを繰り返し実行し、各ファイルを処理するためにgoルーチンを起動します。以前のルーチンが終了するまで、新しいルーチンの起動をブロックします。それぞれのルーチンの中で、私は新しい接続をスピンアップし、文を実行し、実行し、閉じるなどを行います。

このパッケージはパイプラインを提供していますが、処理/キュー/私たちは、現在起こって持っているチャネルアーキテクチャ:

https://github.com/johnnadratowski/golang-neo4j-bolt-driver

は私も使ってみました:

https://github.com/go-cq/cq

しかしときTR tcp connection reset by peerエラーを得続けます同時にNeoに接続することができます。

+0

私はちょうどgolangボルトドライバでNeo4jを掘り下げ始めました。 docsで示されるものの1つは、Connectionオブジェクトはスレッドセーフではありません。それぞれのgoroutineは独自のConnectionを作成する必要があります。これがあなたの問題かどうかはわかりません。 [参考](https://godoc.org/github.com/johnnadratowski/golang-neo4j-bolt-driver#Conn) –

+0

コメントありがとうございました。私はこれに触れてから1年以上経っているので、私はこれを試してみるのに時間を取るかどうか分からないが、もし私がすればあなたに知らせるだろう。私はあなたのコメントを回答として提出したいのですか?それについて考えてみましょう。 –

答えて

0

neo4j-bolt-driverでスレッドセーフではない機能を使用している可能性があります。

のNeo4j-ボルトドライバーによって提供されるドライバの2つのバージョンがあります:

  1. Driver平野ドライバ
  2. DriverPool接続プールを管理してドライバ

は、ドライバ自体はスレッドセーフであるオブジェクト、基礎となる接続を表すConnオブジェクトはそうではありません。おそらくConnオブジェクトを意図していない方法で使用しています。

ゴルーチンでは、Connオブジェクトを作成するには、DriverPoolの方法を使用するのが最善です。接続でCloseが呼び出されると、必ずしも基底の接続を閉じずに、再利用のために接続を再要求するとは限りません。