2013-12-17 4 views
0

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 연결을 처리하도록 설정되었으므로 왜 중요한지 알 수 없습니다.

답변

1

이것은 네트워크 또는 웹 스택 구성 문제처럼 보이므로 py2neo 관점에서 도움을 줄 수 있다고 생각하지 않습니다. 나는 py2neo 1.6으로 업그레이드하는 것을 권하고 싶지만, 클라이언트 HTTP 코드가 완전히 재 작성되었고보다 원활하게 재 연결을 처리 할 수 ​​있습니다.

+0

그래, 내가 생각하기에, 그것을 고정시켰다 (적어도 당분간은). 또한, Node.id를 Node._id로 바꾸는 것에 대한 책임이 있습니다.) – BluePeppers

+0

노드 ID를 일반적으로 직접 사용해서는 안되기 때문입니다 : -P –

관련 문제