こんにちは、これが些細なことに終わらないことを願っています。
私のスタックの関連部分は、Gunicorn/Celery、neomodel (0.3.6)、および py2neo (1.5) です。Neo4j のバージョンは 1.9.4 で、0.0.0.0:7474 にバインドされています (これはすべて Linux にあり、Ubuntu 13.04 だと思います)
そのため、私の gunicorn/celery サーバーはほとんどの場合問題ありませんが、たまに次のエラーが発生します。
ConnectionRefusedError(111, 'Connection refused')
Stacktrace (most recent call last):
File "flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "flask/_compat.py", line 33, in reraise
raise value
File "flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "Noomsa/web/core/util.py", line 156, in inner
user = UserMixin().get_logged_in()
File "Noomsa/web/core/util.py", line 117, in get_logged_in
user = models.User.index.get(username=flask.session["user"])
File "neomodel/index.py", line 50, in get
nodes = self.search(query=query, **kwargs)
File "neomodel/index.py", line 41, in search
return [self.node_class.inflate(n) for n in self._execute(str(query))]
File "neomodel/index.py", line 28, in _execute
return self.__index__.query(query)
File "py2neo/neo4j.py", line 2044, in query
self.__uri__, quote(query, "")
File "py2neo/rest.py", line 430, in _send
raise SocketError(err)
ご覧のとおり、User.index.get
(要求応答の最初の呼び出し) を呼び出すと、ソケット エラーが発生します。時々。ほとんどの場合、問題なく接続されます。このエラーは、neo4j 接続を使用するすべての Flask ビュー/Celery タスクで発生します (実行するだけではありませんUser.index.get
;))。
GraphDatabaseService
これまでのところ、私が取った手順には、オブジェクトがスレッドごとに作成されていることを確認し、約 30 秒ごとに neo4j サーバーに自動的に再接続 (および認証) するように、neomodel 接続関数にモンキー パッチを適用することが含まれていました。これにより、エラーの頻度が減った可能性がありますが、それでも発生します。
オンラインでエラーを探していると、ほとんどの人が間違ったインターフェイス/IP/ポートに接続しようとしているようです。しかし、私の要求の大部分が通過することを考えると、ここではそうではないように感じます.
何か案は?関連しているとは思いませんが、私のデータベースには 38k の孤立したノードがあるようです。それはおそらく、それ自体で別の質問に値するでしょう。
workers=1
編集:追加する必要があります。これは、の代わりに , を使用して gunicorn/celery を実行すると消えるようですworkers=$CPU_N
。$N_CPU*10
どうやらneo4jはデフォルトで接続を処理するように設定されているため、なぜそれが重要なのかわかりません。