Hullo, 이것이 너무 사소한 일은 아니기를 바랍니다.py2neo 쿼리에서 "Random"SocketError/Connection refused 오류가 발생했습니다.
내 스택의 관련 부분은 Gunicorn/Celery, neomodel (0.3.6) 및 py2neo (1.5)입니다. Neo4j 버전은 1.9.4이며, 0.0.0.0:7474에 바인딩되어 있습니다 (이 모든 것들은 리눅스에 있습니다, 우분투 13.04입니다).
그래서 내 gunicorn/셀러리 서버는 대부분 가끔 괜찮습니다. 다음과 같은 오류 :
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보기/셀러리 작업에서 발생합니다 (User.index.get
;을 수행하는 것뿐만 아니라).
지금까지 수행 한 단계는 neoneod 연결 기능을 패치하여 스레드 당 GraphDatabaseService
개체가 만들어 졌는지 확인하고 neo4j 서버에 자동으로 다시 연결 (및 인증) 할 때마다 30 초 정도 걸렸습니다. 이로 인해 오류 빈도가 줄어들었지만 여전히 발생합니다.
온라인으로 오류를 찾는 것은 대부분이 잘못된 인터페이스/ip/port에 연결을 시도하는 것 같습니다. 그러나 대다수의 요청이 이루어지기 때문에 여기에있는 것처럼 느껴지지 않습니다.
아이디어가 있으십니까? 나는 그것이 관련 있다고 생각하지 않지만, 내 데이터베이스는 고아 노드가 38k 인 것으로 보인다. 아마도 그 자체로 다른 질문에 합당 할 것입니다.
편집 : workers=$CPU_N
대신 workers=1
이있는 gunicorn/celery를 실행하면이 부분이 사라지는 것으로 보입니다. 분명히 neo4j가 기본적으로 $N_CPU*10
연결을 처리하도록 설정되었으므로 왜 중요한지 알 수 없습니다.
그래, 내가 생각하기에, 그것을 고정시켰다 (적어도 당분간은). 또한, Node.id를 Node._id로 바꾸는 것에 대한 책임이 있습니다.) – BluePeppers
노드 ID를 일반적으로 직접 사용해서는 안되기 때문입니다 : -P –